반응형

반응형

방법: Windows Phone용 Silverlight 응용프로그램의 시험판 환경 구현

Windows Phone
이 항목은 아직 평가되지 않았습니다.이 항목 평가

2012-02-09

이 항목에서는 Windows Phone 응용프로그램에서 시험판 환경을 구현하는 방법에 대해 설명합니다. 시험판 환경의 목표는 응용프로그램을 구입하기 전에 체험해 볼 수 있는 기회를 사용자에게 제공하는 것입니다. 일반적으로 시험판 환경은 기능이나 게임의 레벨을 사용할 수 없도록 하거나 응용프로그램에 시간 제한을 설정하여 응용프로그램을 제한합니다. 이것은 응용프로그램에 대해 구현할 수 있는 제한 종류의 몇 가지 예일 뿐입니다. 응용프로그램에 대한 제한은 전적으로 회원님이 선택합니다. 이 항목에서는 체험 모드에서 기능이 제한되는 단순한 응용프로그램을 만듭니다. 즉, 응용프로그램을 체험 모드로 실행하는 경우 일부 기능을 사용할 수 없습니다. LicenseInformation 클래스를 사용하여 응용프로그램이 어떤 모드에서 실행되고 있는지 확인합니다. XNA Framework 응용프로그램의 시험판 환경 구현에 대한 자세한 내용은 방법: Windows Phone용 XNA Framework 응용프로그램의 시험판 환경 구현을 참조하십시오. 이 응용프로그램에 설명된 기능의 완성된 샘플을 다운로드할 수 있습니다. 자세한 내용은 시험판 응용프로그램 샘플(Silverlight)을 참조하십시오.

이 항목은 다음 섹션으로 이루어져 있습니다.

이 단원에서는 시험판 환경으로 응용프로그램을 보여 주는 UI를 만듭니다. 이것은 Windows Phone용 Silverlight 응용프로그램입니다. 응용프로그램이 시작되면 응용프로그램의 현재 라이선스를 확인합니다. 응용프로그램에 평가판 라이선스가 있는 경우 특정 기능을 사용하지 않도록 설정합니다. 응용프로그램에 정식 라이선스가 있는 경우 모든 기능을 사용하도록 설정합니다. 실제 라이선스 정보는 응용프로그램이 Windows Phone 마켓플레이스 에 게시된 후에만 사용할 수 있습니다. 따라서 시험판 환경을 테스트하려면 라이선스 검색을 시뮬레이션해야 합니다. 응용프로그램이 디버그 모드로 실행 중인 경우 프로그래밍 방식으로 응용프로그램의 IsTrial 속성을 설정하여 이 작업을 수행합니다. 응용프로그램이 게시된 후에는LicenseInformation.IsTrial 속성을 검사하여 응용프로그램의 IsTrial 속성을 설정합니다.

응용프로그램 사용자 인터페이스를 만들려면

  1. Windows Phone용 Visual Studio 2010 Express 에서 파일 | 새 프로젝트 메뉴 명령을 선택하여 새 프로젝트를 만듭니다.

  2. 새 프로젝트 창이 표시됩니다. Visual C# 템플릿을 확장하고 Windows Phone용 Silverlight 템플릿을 선택합니다.

  3. Windows Phone 응용프로그램 템플릿을 선택합니다. 이름에 선택한 이름을 입력합니다.

  4. 확인을 클릭합니다. 새 프로젝트가 생성되고 MainPage.xaml이 Visual Studio 디자이너 창에서 열립니다.

  5. MainPage.xaml에서 Grid의 XAML 코드("LayoutRoot")를 제거하고 다음 코드로 바꿉니다.

            <Grid x:Name="LayoutRoot" Background="Transparent">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
    
            <!--TitlePanel contains the name of the application and page title.-->
            <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
                <TextBlock x:Name="ApplicationTitle" Text="Trial Application Experience" Style="{StaticResource PhoneTextNormalStyle}" Margin="5"/>
                <TextBlock x:Name="PageTitle" Text="main page" Style="{StaticResource PhoneTextTitle1Style}" Margin="5"/>
            </StackPanel>
    
            <!--ContentPanel - place additional content here-->
            <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
                <Grid.RowDefinitions>
                    <RowDefinition Height="200"/>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                </Grid.RowDefinitions>
                <StackPanel Grid.Row="0" Orientation="Horizontal"
                            HorizontalAlignment="Center" VerticalAlignment="Center">
                    <TextBlock Text="License:" FontSize="{StaticResource PhoneFontSizeExtraLarge}" />
                    <TextBlock x:Name="tbTrialStatus" FontSize="{StaticResource PhoneFontSizeExtraLarge}" />
                </StackPanel>
                <TextBlock Grid.Row="1" Text="My Application Features" HorizontalAlignment="Center"/>
                <StackPanel Grid.Row="2"  Orientation="Horizontal" HorizontalAlignment="Center">
                    <Button Content=" A" Height="78" Width="100" x:Name="btnFeatureA" Click="btnFeatureA_Click"/>
                    <Button Content=" B" Height="78" Width="100" x:Name="btnFeatureB" Click="btnFeatureB_Click"/>
                    <Button Content=" C" Height="78" Width="100" x:Name="btnFeatureC" Click="btnFeatureC_Click"/>
                </StackPanel>
                <Button Grid.Row="3" x:Name="btnBuyApplication" Content="Buy the Application" Click="btnBuyApplication_Click" Height="78"/>
            </Grid>
        </Grid>
    
    

    앞의 XAML 코드는 다음 스크린샷과 같은 단순 사용자 인터페이스를 만듭니다.

    Silverlight 시험판 응용프로그램의 화면 캡처

    응용프로그램에는 각각 응용프로그램의 한 기능을 나타내는 버튼 세 개가 있습니다. UI에는 현재 라이선스 정보를 보여 주는 상태 텍스트와 응용프로그램 구입 버튼도 포함되어 있습니다. 앞의 코드와 스크린샷은 시험판 환경 빌드의 핵심 개념을 보여 주는 기본 예제로 사용됩니다. 각 버튼의 이벤트 처리기는 다음 단원에서 정의합니다.

이 단원에서는 LicenseInformation 개체를 사용하여 응용프로그램의 현재 라이선스를 확인합니다. 실제 라이선스 정보는 응용프로그램이 Windows Phone 마켓플레이스 에 게시된 후에만 사용할 수 있습니다. 따라서 시험판 환경을 테스트하려면 라이선스 검색을 시뮬레이션해야 합니다. 응용프로그램이 디버그 모드로 실행 중인 경우 프로그래밍 방식으로 응용프로그램의IsTrial 속성을 설정하여 이 작업을 수행합니다. 응용프로그램이 게시된 후에는 LicenseInformation.IsTrial 속성을 검사하여 응용프로그램의 IsTrial 속성을 설정합니다.

응용프로그램에서 평가판 라이선스를 확인하려면

  1. App.xaml.cs를 열고 페이지의 맨 위에 다음 using 지시문을 추가합니다.

    using Microsoft.Phone.Marketplace;
    
    
  2. App 클래스에서 다음 로컬 정적 변수를 선언합니다. LicenseInformation 클래스를 사용하면 응용프로그램이 평가판 라이선스로 실행 중인지 확인할 수 있습니다.

         private static LicenseInformation _licenseInfo = new LicenseInformation();
    
    
  3. App.xaml.cs의 동일한 App 클래스에서 다음 읽기 전용 속성과 지역 변수를 추가합니다. 이 속성은 응용프로그램이 실행되는 동안 라이선스 정보를 캐시하는 데 사용됩니다. 현재 라이선스 정보를 확인해야 할 때마다 응용프로그램에서 이 속성을 사용합니다.

            private static bool _isTrial = true;
            public bool IsTrial
            {
                get
                {
                    return _isTrial;
                }
            }
    
    
  4. 다음 단원에서는 Application_Launching 및 Application_Activated 이벤트 처리기에서 라이선스 정보를 확인합니다. 이 논리는 두 위치에서 사용되므로 편의상 고유한 메서드에 래핑합니다. App.xaml.cs에 있는 App 클래스에서 다음 메서드를 추가합니다.

            /// <summary>
            /// Check the current license information for this application
            /// </summary>
            private void CheckLicense()
            {
                // When debugging, we want to simulate a trial mode experience. The following conditional allows us to set the _isTrial 
                // property to simulate trial mode being on or off. 
    #if DEBUG
                string message = "This sample demonstrates the implementation of a trial mode in an application." +
                                   "Press 'OK' to simulate trial mode. Press 'Cancel' to run the application in normal mode.";
                if (MessageBox.Show(message, "Debug Trial",
                     MessageBoxButton.OKCancel) == MessageBoxResult.OK)
                {
                    _isTrial = true;
                }
                else
                {
                    _isTrial = false;
                }
    #else
                _isTrial = _licenseInfo.IsTrial();
    #endif
            }
    
    

    앞의 메서드는 응용프로그램이 디버그 모드로 실행되는지 여부에 따라 두 개의 코드 경로로 구성됩니다. 디버그 모드에서는 조건부 컴파일 지시문 #if Debug 및 #else 지시문 사이의 코드가 실행됩니다. 체험 모드를 시뮬레이션할 것인지 여부를 묻는 메시지가 사용자에게 표시됩니다. 사용자가 OK를 선택하면 _isTrial 변수가 true로 설정되고, 그렇지 않으면 false로 설정됩니다. 응용프로그램이 릴리스 모드로 빌드된 경우 #else 및 #endif 사이의 코드가 실행되며_isTrial 변수가 LicenseInformation 개체의 IsTrial 속성을 검사하여 설정됩니다.

  5. 응용프로그램을 시작하거나 계속할 때마다 응용프로그램 라이선스가 확인되어야 합니다. Application_Launching및 Application_Activated 이벤트 처리기에서 라이선스 정보를 확인하여 이 작업을 수행합니다. App.xaml.csApplication_Launching 이벤트 처리기를 다음 코드로 바꿉니다.

            private void Application_Launching(object sender, LaunchingEventArgs e)
            {
                CheckLicense();
            }
    
    
  6. App.xaml.cs의 Application_Activated 이벤트 처리기를 다음 코드로 바꿉니다.

            private void Application_Activated(object sender, ActivatedEventArgs e)
            {
                CheckLicense();
            }
    
    

이 단원에서는 응용프로그램의 현재 라이선스 정보를 사용하여 체험 모드의 응용프로그램을 제한합니다. 응용프로그램 제한 방법은 회원님이 선택합니다. 이 예제에서는 응용프로그램의 한 기능을 나타내는 버튼을 UI에서 사용할 수 없게 하여 체험 모드의 응용프로그램을 제한합니다. Show 메서드를 호출하여 사용자가 Windows Phone 마켓플레이스 를 통해 응용프로그램을 구입할 수 있게 하는 버튼도 UI에 표시됩니다. 응용프로그램이 Windows Phone 마켓플레이스 에 게시되지 않았으므로 Show호출 시 오류가 발생합니다. 이것은 예상된 동작입니다.

현재 응용프로그램 라이선스 정보를 기준으로 기능을 사용하거나 사용하지 않도록 설정하려면

  • MainPage.xaml.cs 코드 숨김 파일에서 다음 메서드를 추가합니다.

           protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
            {
                base.OnNavigatedTo(e);
    
                if ((Application.Current as App).IsTrial)
                {
                    btnBuyApplication.Visibility = System.Windows.Visibility.Visible;
                    btnFeatureC.IsEnabled = false;
                    tbTrialStatus.Text = "Trial";
                }
                else
                {
                    btnBuyApplication.Visibility = System.Windows.Visibility.Collapsed;
                    btnFeatureC.IsEnabled = true;
                    tbTrialStatus.Text = "Full";
                }
            }
    
            private void btnFeatureA_Click(object sender, RoutedEventArgs e)
            {
                MessageBox.Show("Feature A");
            }
    
            private void btnFeatureB_Click(object sender, RoutedEventArgs e)
            {
                MessageBox.Show("Feature B");
            }
    
            private void btnFeatureC_Click(object sender, RoutedEventArgs e)
            {
                MessageBox.Show("Feature C");
            }
    
    

    앞의 코드에서는 OnNavigatedTo 메서드를 재정의하여 사용자가 이 페이지로 이동할 때마다 현재 라이선스 정보를 확인합니다. 이전 단원에서 정의된 App 클래스의 IsTrial 속성을 검사하여 응용프로그램이 체험 모드로 실행되고 있는지, 아니면 정식 라이선스로 실행되고 있는지 확인합니다. 이 속성에서 true가 반환되면 응용프로그램이 체험 모드로 실행되고 있는 것입니다. 체험 모드에서 특정 기능의 비활성화를 시뮬레이션하기 위해 btnFeatureC 버튼이 비활성화됩니다. 또한 사용자가 응용프로그램 구입을 시작할 수 있도록 btnBuyApplication 버튼이 표시됩니다. 최종적으로,tbTrialStatusTextBlock에 라이선스 상태가 설정됩니다.

    IsTrial 속성이 false인 경우 모든 기능을 사용할 수 있습니다. 사용자가 응용프로그램의 정식 라이선스를 가지고 있으므로 btnBuyApplication 버튼은 숨겨집니다. 최종적으로, tbTrialStatusTextBlock에 라이선스 상태가 설정됩니다. 클릭 이벤트 세 개를 사용하여 사용자가 UI에서 기능 버튼 중 하나를 클릭할 때 메시지를 표시합니다.

이 단원에서는 MarketplaceDetailTask를 사용하여 사용자가 응용프로그램을 구입할 수 있도록 Windows Phone 마켓플레이스 의 해당 응용프로그램으로 이동합니다.

사용자에게 응용프로그램을 구입하라는 메시지를 표시하려면

  1. MainPage.xaml.cs를 열고 페이지의 맨 위에 다음 using 지시문을 추가합니다.

    using Microsoft.Phone.Tasks;
    
    
  2. MainPage.xaml.cs 코드 숨김 파일의 MainPage 클래스 맨 위에 다음 변수를 추가합니다.

            // Declare the MarketplaceDetailTask object with page scope
            // so we can access it from event handlers.
            MarketplaceDetailTask _marketPlaceDetailTask = new MarketplaceDetailTask();
    
    
  3. MainPage.xaml.cs 코드 숨김 파일에서 다음 메서드를 추가합니다.

            private void btnBuyApplication_Click(object sender, RoutedEventArgs e)
            {
                _marketPlaceDetailTask.Show();
            }
    
    

    UI에서 btnBuyApplication 버튼을 클릭할 때 앞의 코드에서는 Windows Phone 마켓플레이스 클라이언트 응용프로그램을 표시하고 지정한 제품에 대한 세부 정보 페이지를 표시합니다. 사용자가 응용프로그램을 구입할 수 있습니다. 이 예제에서는 응용프로그램이 Windows Phone 마켓플레이스 에 게시되지 않았습니다. 따라서_marketPlaceDetailTask.Show() 호출 시 오류가 표시됩니다. 이 오류에 오류 코드 805a0941이 있으면 호출이 성공한 것이며 응용프로그램을 게시할 때 올바르게 작동합니다. 응용프로그램이 게시되면 Show가 응용프로그램의 고유 ID를 자동으로 검색하고 Windows Phone 마켓플레이스 클라이언트 응용프로그램에서 올바른 세부 정보 페이지를 시작합니다.

응용프로그램을 실행하려면

  1. 단말기 또는 에뮬레이터에서 디버그 | 디버깅 시작 메뉴 명령을 선택하여 응용프로그램을 실행합니다.

    참고참고:

    체험 모드 시뮬레이션을 선택하는 옵션은 응용프로그램이 디버그 모드로 실행되는 경우에만 사용할 수 있습니다. 이는 체험 모드 시뮬레이션이 릴리스 빌드의 응용프로그램에서 실행되어 이 테스트 기능이 활성화된 상태로 Windows Phone 마켓플레이스 에 실수로 게시되는 것을 방지하기 위한 것입니다.

  2. 응용프로그램이 시작되면 메시지 상자가 표시됩니다. OK를 클릭하여 체험 모드를 시뮬레이션합니다.

  3. 응용프로그램의 기본 페이지에서 License 필드가 Trial로 설정되고 Feature C 버튼이 비활성화된 것을 확인합니다.

  4. Buy the Application 버튼을 클릭합니다. Windows Phone 마켓플레이스 클라이언트 응용프로그램을 열려고 시도합니다.

  5. 다음 이미지와 같은 오류 대화 상자가 나타납니다. 이는 응용프로그램이 성공적으로 Windows Phone 마켓플레이스 클라이언트 응용프로그램을 열었음을 나타냅니다. 게시된 응용프로그램에서는 이 오류가 발생하지 않으며 응용프로그램을 구입할 수 있는 Windows Phone 마켓플레이스 의 응용프로그램 세부 정보 페이지로 이동됩니다.

    MarketplaceDetailTask.Show() 오류
  6. 오류 대화 상자에서 Close를 클릭합니다. 응용프로그램이 계속됩니다.

  7. 정식 라이선스를 시뮬레이션하도록 응용프로그램을 실행하려면 이 절차의 2단계에서 표시되는 MessageBox에서Cancel을 클릭합니다. 또는 디버그 | 디버깅하지 않고 시작 메뉴 명령을 선택하여 응용프로그램을 시작할 수 있습니다. 이 모드에서는 Buy the Application 버튼이 숨겨지며 Feature C 버튼을 사용할 수 있습니다.

반응형
Posted by 컴스터
,
반응형

1. 우선 컬럼 추가 한다. int?, CanBeNull = true 널을 허용해야 기존 데이터 불러올때 에러 안남.


private int? _Memo_Order;


        [Column(CanBeNull = true)]

        public int? Memo_Order

        {

            get

            {

                return _Memo_Order;

            }

            set

            {

                if (_Memo_Order != value)

                {

                    NotifyPropertyChanging("Memo_Order");

                    _Memo_Order = value;

                    NotifyPropertyChanged("Memo_Order");

                }

            }

        }


2. App.xaml.cs 에

 // 현재 버전.

 public static int APP_VERSION = 2; 추가한다.


3. 데이터 베이스 생성 부분에.

// 데이터 베이스 생성(기존에 있는 부분).

            using (DataContext_CheckToDo db = new DataContext_CheckToDo(str_DbConnection))

            {

                if (db.DatabaseExists() == false)

                {

                    db.CreateDatabase();


                    db.SubmitChanges();


                    // Set the new database version.(이부분 새로 추가 부분)

                    DatabaseSchemaUpdater dbUpdater = db.CreateDatabaseSchemaUpdater();

                    dbUpdater.DatabaseSchemaVersion = APP_VERSION;

                    dbUpdater.Execute();

                }

                else

                {

                    // Check whether a database update is needed.(이부분 새로추가 부분)

                    DatabaseSchemaUpdater dbUpdater = db.CreateDatabaseSchemaUpdater();


                    if (dbUpdater.DatabaseSchemaVersion < APP_VERSION)

                    {

                        // Add the Priority column (added in version 2).

                        dbUpdater.AddColumn<Tb_Memo>("Memo_Order");


                        // Add the new database version.

                        dbUpdater.DatabaseSchemaVersion = 2;


                        // Perform the database update in a single transaction.

                        dbUpdater.Execute();

                    }

                }

            }


반응형
Posted by 컴스터
,
반응형

방법: Windows Phone의 설정 페이지 만들기

Windows Phone
이 항목은 아직 평가되지 않았습니다.이 항목 평가

2012-02-09

이 항목에서는 Windows Phone 응용프로그램의 설정 페이지를 만드는 데 필요한 단계를 소개합니다. 이 완성된 설정 샘플은 Windows Phone용 코드 샘플 항목에서 확인할 수 있습니다.

Windows Phone 응용프로그램의 설정 페이지를 만드는 첫 번째 단계는 설정을 포함할 클래스를 만들고 격리된 저장소에 설정을 저장 및 로드하는 것입니다. 설정을 키-값 쌍으로 격리된 저장소에 저장하는 방법에 대한 자세한 내용은 IsolatedStorageSettings 클래스를 참조하십시오. 일반적인 격리된 저장소에 대한 자세한 내용은 Windows Phone의 로컬 데이터 저장소를 참조하십시오.

이 클래스에는 격리된 저장소에 값을 추가하거나 업데이트하는 메서드가 포함됩니다. 다음 코드에서는 이 메서드를 AddOrUpdateValue라고 합니다. 값을 읽거나, 설정이 지정되지 않은 경우 기본값을 할당하는 메서드도 있습니다. 다음 코드에서는 이 메서드를 GetValueOrDefault라고 합니다.

각 설정이나 속성에 대해 접근자 함수가 있습니다. 다음 코드에는 CheckBoxSettingListBoxSetting 및 PasswordSetting이라는 여러 함수가 있습니다. 고유한 접근자 함수에 추가하여 고유한 속성을 추가할 수 있습니다. 각 설정에 대해 격리된 저장소 키 이름을 정의하는 문자열 상수와 기본값을 정의하는 상수가 있습니다.

using System;
using System.IO.IsolatedStorage;
using System.Diagnostics;
using System.Collections.Generic;

namespace SettingsSample
{
    public class AppSettings
    {
        // Our isolated storage settings
        IsolatedStorageSettings settings;

        // The isolated storage key names of our settings
        const string CheckBoxSettingKeyName = "CheckBoxSetting";
        const string ListBoxSettingKeyName = "ListBoxSetting";
        const string RadioButton1SettingKeyName = "RadioButton1Setting";
        const string RadioButton2SettingKeyName = "RadioButton2Setting";
        const string RadioButton3SettingKeyName = "RadioButton3Setting";
        const string UsernameSettingKeyName = "UsernameSetting";
        const string PasswordSettingKeyName = "PasswordSetting";

        // The default value of our settings
        const bool CheckBoxSettingDefault = true;
        const int ListBoxSettingDefault = 0;
        const bool RadioButton1SettingDefault = true;
        const bool RadioButton2SettingDefault = false;
        const bool RadioButton3SettingDefault = false;
        const string UsernameSettingDefault = "";
        const string PasswordSettingDefault = "";

        /// <summary>
        /// Constructor that gets the application settings.
        /// </summary>
        public AppSettings()
        {
            // Get the settings for this application.
            settings = IsolatedStorageSettings.ApplicationSettings;
        }

        /// <summary>
        /// Update a setting value for our application. If the setting does not
        /// exist, then add the setting.
        /// </summary>
        /// <param name="Key"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public bool AddOrUpdateValue(string Key, Object value)
        {
            bool valueChanged = false;

            // If the key exists
            if (settings.Contains(Key))
            {
                // If the value has changed
                if (settings[Key] != value)
                {
                    // Store the new value
                    settings[Key] = value;
                    valueChanged = true;
                }
            }
            // Otherwise create the key.
            else
            {
                settings.Add(Key, value);
                valueChanged = true;
            }
           return valueChanged;
        }

        /// <summary>
        /// Get the current value of the setting, or if it is not found, set the 
        /// setting to the default setting.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="Key"></param>
        /// <param name="defaultValue"></param>
        /// <returns></returns>
        public T GetValueOrDefault<T>(string Key, T defaultValue)
        {
            T value;

            // If the key exists, retrieve the value.
            if (settings.Contains(Key))
            {
                value = (T)settings[Key];
            }
            // Otherwise, use the default value.
            else
            {
                value = defaultValue;
            }
            return value;
        }

        /// <summary>
        /// Save the settings.
        /// </summary>
        public void Save()
        {
            settings.Save();
        }


        /// <summary>
        /// Property to get and set a CheckBox Setting Key.
        /// </summary>
        public bool CheckBoxSetting
        {
            get
            {
                return GetValueOrDefault<bool>(CheckBoxSettingKeyName, CheckBoxSettingDefault);
            }
            set
            {
                if (AddOrUpdateValue(CheckBoxSettingKeyName, value))
                {
                    Save();
                }
            }
        }


        /// <summary>
        /// Property to get and set a ListBox Setting Key.
        /// </summary>
        public int ListBoxSetting
        {
            get
            {
                return GetValueOrDefault<int>(ListBoxSettingKeyName, ListBoxSettingDefault);
            }
            set
            {
                if (AddOrUpdateValue(ListBoxSettingKeyName, value))
                {
                   Save();
                }
            }
        }


        /// <summary>
        /// Property to get and set a RadioButton Setting Key.
        /// </summary>
        public bool RadioButton1Setting
        {
            get
            {
                return GetValueOrDefault<bool>(RadioButton1SettingKeyName, RadioButton1SettingDefault);
            }
            set
            {
                if (AddOrUpdateValue(RadioButton1SettingKeyName, value))
                {    
                    Save();
                }
            }
        }


        /// <summary>
        /// Property to get and set a RadioButton Setting Key.
        /// </summary>
        public bool RadioButton2Setting
        {
            get
            {
                return GetValueOrDefault<bool>(RadioButton2SettingKeyName, RadioButton2SettingDefault);
            }
            set
            {
                if (AddOrUpdateValue(RadioButton2SettingKeyName, value))
                {
                    Save();
                }
            }
        }

        /// <summary>
        /// Property to get and set a RadioButton Setting Key.
        /// </summary>
        public bool RadioButton3Setting
        {
            get
            {
                return GetValueOrDefault<bool>(RadioButton3SettingKeyName, RadioButton3SettingDefault);
            }
            set
            {
                if (AddOrUpdateValue(RadioButton3SettingKeyName, value))
                {
                    Save();
                }
            }
        }

        /// <summary>
        /// Property to get and set a Username Setting Key.
        /// </summary>
        public string UsernameSetting
        {
            get
            {
                return GetValueOrDefault<string>(UsernameSettingKeyName, UsernameSettingDefault);
            }
            set
            {
                if (AddOrUpdateValue(UsernameSettingKeyName, value))
                {
                    Save();
                }
            }
        }

        /// <summary>
        /// Property to get and set a Password Setting Key.
        /// </summary>
        public string PasswordSetting
        {
            get
            {
                return GetValueOrDefault<string>(PasswordSettingKeyName, PasswordSettingDefault);
            }
            set
            {
                if (AddOrUpdateValue(PasswordSettingKeyName, value))
                {
                    Save();
                }
            }
        }
    }
}

사용자가 확인 버튼을 누를 필요가 없는 페이지의 경우 데이터 바인딩을 사용하여 설정 변경 사항을 즉시 적용하고 값을 격리된 저장소에 저장할 수 있습니다. 모든 변경 사항은 설정 페이지의 XAML에서 수행됩니다. TwoWay의 데이터 바인딩 모드에서는 변경 사항을 즉시 적용합니다.

참고참고:

설정 페이지의 UI를 디자인하는 방법에 대한 자세한 내용은 Windows Phone의 사용자 환경 디자인 지침을 참조하십시오.

먼저 xmlns:local="clr-namespace:SettingsSample" 네임스페이스 선언을 추가합니다.

x:Class="SettingsSample.SettingsWithoutConfirmation"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

xmlns:local="clr-namespace:SettingsSample"

FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="480"
shell:SystemTray.IsVisible="True">

<local:AppSettings x:Key="appSettings"></local:AppSettings> 로컬 리소스를 추가합니다.

<phone:PhoneApplicationPage.Resources>
    <local:AppSettings x:Key="appSettings"></local:AppSettings>
</phone:PhoneApplicationPage.Resources>

페이지의 각 설정에 대해 속성과 컨트롤 간의 데이터 바인딩을 설정합니다.

<Grid x:Name="ContentGrid" Grid.Row="1">
    <CheckBox Content="CheckBox Setting" Height="Auto" HorizontalAlignment="Left" Margin="60,20,0,0" Name="checkBoxSetting" VerticalAlignment="Top"
            IsChecked="{Binding Source={StaticResource appSettings}, Path=CheckBoxSetting, Mode=TwoWay}"  />

    <ListBox Height="140" HorizontalAlignment="Left" Margin="70,150,0,0" Name="listBoxSetting" 
        VerticalAlignment="Top" Width="360"  SelectedIndex="{Binding Source={StaticResource appSettings}, Path=ListBoxSetting, Mode=TwoWay}">

        <ListBoxItem Content="Times New Roman" FontSize="24" FontFamily="Times New Roman" />
        <ListBoxItem Content="Arial" FontSize="24" FontFamily="Arial" />
        <ListBoxItem Content="Comic Sans MS" FontSize="24" FontFamily="Comic Sans MS" />
    </ListBox>

    <RadioButton Content="Choice One" Height="Auto" HorizontalAlignment="Left" Margin="60,0,0,235" Name="radioButton1" VerticalAlignment="Bottom" GroupName="GroupOne" IsChecked="{Binding Source={StaticResource appSettings}, Path=RadioButton1Setting, Mode=TwoWay}" />
    <RadioButton Content="Choice Two" Height="Auto" HorizontalAlignment="Left" Margin="60,350,0,0" Name="radioButton2" VerticalAlignment="Top" GroupName="GroupOne" IsChecked="{Binding Source={StaticResource appSettings}, Path=RadioButton2Setting, Mode=TwoWay}"/>
    <RadioButton Content="Choice Three" Height="Auto" HorizontalAlignment="Left" Margin="60,400,0,0" Name="radioButton3" VerticalAlignment="Top" GroupName="GroupOne" IsChecked="{Binding Source={StaticResource appSettings}, Path=RadioButton3Setting, Mode=TwoWay}"/>
</Grid>

추가 코드나 작업은 필요하지 않습니다. 설정 페이지가 완성되었습니다.

사용자 이름 또는 비밀번호와 같은 텍스트 입력이 필요한 설정에서는 사용자가 입력 완료 시 확인 버튼을 눌러야 할 수도 있습니다. 이러한 설정 페이지의 경우 생성자에 응용프로그램 모음을 추가하여 OK 및 Cancel 버튼을 페이지에 추가할 수 있습니다.

사용자가 확인 버튼을 눌러야 하는 페이지의 경우 단방향 데이터 바인딩을 사용하여 현재 값을 로드할 수 있지만 사용자 변경 사항이 즉시 적용되지 않습니다.

먼저 xmlns:local="clr-namespace:SettingsSample" 네임스페이스 선언을 추가합니다.

x:Class="SettingsSample.SettingsWithConfirmation"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

xmlns:local="clr-namespace:SettingsSample"

FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="480"
shell:SystemTray.IsVisible="True">

<local:AppSettings x:Key="appSettings"></local:AppSettings> 로컬 리소스를 추가합니다.

<phone:PhoneApplicationPage.Resources>
    <local:AppSettings x:Key="appSettings"></local:AppSettings>
</phone:PhoneApplicationPage.Resources>

페이지의 각 설정에 대해 속성과 컨트롤 간의 단방향 데이터 바인딩을 설정합니다.

<Grid x:Name="ContentGrid" Grid.Row="1">
    <TextBlock Height="60" HorizontalAlignment="Left" Margin="65,12,0,0" Name="textBlock1" Text="Username" VerticalAlignment="Top" Width="169" />
    <TextBox Height="78" HorizontalAlignment="Left" Margin="60,60,0,0" Name="textBoxUsername" 
        Text="{Binding Path=UsernameSetting, Mode=OneWay, Source={StaticResource appSettings}}" VerticalAlignment="Top" Width="274"  />

    <TextBlock Height="60" HorizontalAlignment="Left" Margin="65,160,0,0" Name="textBlock2" Text="Password" VerticalAlignment="Top" Width="169" />
    <PasswordBox Height="78" HorizontalAlignment="Left" Margin="60,208,0,0" Name="passwordBoxPassword" 
        Password="{Binding Path=PasswordSetting, Mode=OneWay, Source={StaticResource appSettings}}" VerticalAlignment="Top" Width="274" />
</Grid>

페이지의 생성자에 OK 및 Cancel 버튼이 있는 응용프로그램 모음을 추가합니다.

public SettingsWithConfirmation()
{

    InitializeComponent();

    // Add an Application Bar that has a 'done' confirmation button and 
    // a 'cancel' button
    ApplicationBar = new ApplicationBar();
    ApplicationBar.IsMenuEnabled = true;
    ApplicationBar.IsVisible = true;
    ApplicationBar.Opacity = 1.0;

    ApplicationBarIconButton doneButton = new ApplicationBarIconButton(new Uri("/Images/appbar.check.rest.png", UriKind.Relative));
    doneButton.Text = "done";
    doneButton.Click += new EventHandler(doneButton_Click);

    ApplicationBarIconButton cancelButton = new ApplicationBarIconButton(new Uri("/Images/appbar.cancel.rest.png", UriKind.Relative));
    cancelButton.Text = "cancel";
    cancelButton.Click += new EventHandler(cancelButton_Click);

    ApplicationBar.Buttons.Add(doneButton);
    ApplicationBar.Buttons.Add(cancelButton);
}

사용자가 변경 사항을 확인하면 값이 저장됩니다.

void doneButton_Click(object sender, EventArgs e)
{
    settings.UsernameSetting = textBoxUsername.Text;
    settings.PasswordSetting = passwordBoxPassword.Password;
    NavigationService.GoBack();
}

하지만 사용자가 변경 사항을 취소하면 저장하지 않고 페이지를 벗어난 부분을 탐색합니다.

void cancelButton_Click(object sender, EventArgs e)
{
    NavigationService.GoBack();
}

반응형
Posted by 컴스터
,
반응형

연습: Windows Phone의 로컬 데이터베이스 응용프로그램 업데이트

Windows Phone
이 항목은 아직 평가되지 않았습니다.이 항목 평가

2012-02-09

Windows Phone OS 7.1 에서는 응용프로그램의 격리된 저장소 컨테이너에 있는 로컬 데이터베이스에 관계형 데이터를 저장할 수 있습니다. 응용프로그램이 발전함에 따라 응용프로그램이 단말기에 배포된 후 데이터베이스의 스키마를 변경해야 할 수 있습니다. 대부분의 스키마 업데이트에 대해 DatabaseSchemaUpdater 클래스를 사용할 수 있습니다. DatabaseSchemaUpdater를 사용하면 응용프로그램 업데이트의 일부로 열, 인덱스, 테이블 및 연결을 로컬 데이터베이스에 추가할 수 있습니다. 이 연습에서는 로컬 데이터베이스 샘플 응용프로그램을 예제로 사용하여 로컬 데이터베이스를 업데이트하는 방법에 대해 설명합니다. Windows Phone 응용프로그램에서 로컬 데이터베이스를 사용하는 방법에 대한 자세한 내용은 Windows Phone의 로컬 데이터베이스 개요를 참조하십시오.

참고참고:

로컬 데이터베이스에 열/인덱스/테이블 추가보다 광범위한 변경 사항이 필요한 경우 새 데이터베이스를 만들고 이전 데이터베이스에서 새 데이터베이스로 데이터를 마이그레이션해야 할 수 있습니다. 자세한 내용은 Windows Phone의 로컬 데이터베이스 마이그레이션 개요를 참조하십시오.

이 연습에서는 로컬 데이터베이스 샘플을 두 번 업데이트합니다. 첫 번째 업데이트는 각 작업의 우선 순위를 저장할 열을 추가합니다. 두 번째 업데이트는 Items 테이블에 인덱스를 추가합니다. 각 연습 단계 후에 격리된 저장소 탐색기를 사용하여 이전 버전의 데이터베이스에서 업데이트를 테스트합니다. 격리된 저장소 탐색기에 대한 자세한 내용은방법: 격리된 저장소 탐색기 도구 사용을 참조하십시오.

이 연습을 완료한 후 업데이트된 로컬 데이터베이스 샘플은 다음 예제처럼 표시됩니다.

AP_Con_LocalDatabaseUpdate_Features

이 예제에서 첫 번째 업데이트의 일부로 추가된 우선 순위 열에서는 각 작업의 색이 작업 우선 순위를 기준으로 변경될 수 있습니다. 할당된 우선 순위가 없는 항목은 흰색으로 남아 있습니다. 다음 이미지는 기본 페이지와 새 작업 페이지가 새 우선 순위 기능을 사용하는 방법을 보여 줍니다.

이 항목은 다음 섹션으로 이루어져 있습니다.

  1. 버전 0의 기준선 데이터베이스 만들기

  2. 버전 2 준비: 작업 우선 순위 추가

  3. 데이터베이스 업데이트 테스트

  4. 버전 2의 기준선 데이터베이스 만들기

  5. 버전 3 준비: 인덱스 추가, 여러 업그레이드 경로 고려

  6. 이전 데이터베이스 버전에서 버전 3 업데이트 테스트

  7. 새로 설치 테스트: 로컬 데이터베이스 제거

이 단원에서는 로컬 데이터베이스 샘플을 실행하고, 일부 작업을 데이터베이스에 추가한 다음 이 연습의 뒷부분에서 업데이트를 테스트하기 위해 데이터베이스 복사본을 저장합니다. 로컬 데이터베이스 샘플의 작동 방식에 대한 자세한 내용은 방법: Windows Phone의 로컬 데이터베이스 응용프로그램(MVVM 포함) 만들기를 참조하십시오.

참고참고:

데이터베이스를 만들 때 데이터베이스 스키마 버전을 명시적으로 지정하지 않았으므로 로컬 데이터베이스 샘플의 DatabaseSchemaVersion 속성은 이 연습을 시작할 때의 0과 같습니다. 다음 버전의 데이터베이스와 관련된 혼동을 줄이기 위해 이 연습에서는 버전 1을 건너뜁니다.

버전 0의 기준선 데이터베이스를 만들려면

  1. 로컬 데이터베이스 샘플(C#)을 다운로드하고 프로젝트를 컴퓨터의 폴더에 저장합니다.

  2. 프로젝트의 압축을 풀고 Visual Studio에서 엽니다.

  3. F5 키를 눌러 디버깅을 시작하고 응용프로그램을 테스트합니다.

  4. 에뮬레이터 또는 단말기의 응용프로그램 모음에서 추가 버튼을 탭하여 응용프로그램에 여러 작업을 추가합니다. 각 응용프로그램 피벗 페이지에서 작업을 보려면 각 카테고리(HomeWork 및 Hobbies)로 작업을 추가합니다.

    팁팁:

    Windows Phone 에뮬레이터를 사용하는 경우 Page Up 키를 눌러 키보드로 텍스트 값을 입력합니다.

    다음 이미지는 home taskwork task 및 hobby task의 세 가지 작업이 있는 데이터베이스 버전 0을 보여 줍니다.

    AP_Con_LocalDatabaseUpdate_Baseline0
  5. 디버그 메뉴에서 디버깅 중지를 클릭합니다. 에뮬레이터를 닫거나, 단말기의 테더링을 취소하거나, 에뮬레이터 또는 단말기에서 응용프로그램을 시작하지 마십시오.

  6. 컴퓨터에 LocalDatabaseVersion0이라는 폴더를 만듭니다. 이 폴더는 데이터베이스 스키마 버전 0의 기준선 데이터베이스를 저장하는 데 사용됩니다.

  7. 격리된 저장소 탐색기를 사용하여 응용프로그램에서 LocalDatabaseVersion0 폴더로 로컬 데이터베이스를 복사합니다. 자세한 내용은 방법: 격리된 저장소 탐색기 도구 사용을 참조하십시오. 다음 예제에서는 에뮬레이터에서 c:\LocalDatabaseVersion0\IsolatedStore\ToDo.sdf로 데이터베이스 파일을 복사합니다.

    ISETool.exe ts xd 77a80316-384d-40dc-a8c3-c4054676e85c "C:\LocalDatabaseVersion0"
    

    GUID 값은 응용프로그램 매니페스트 파일에서 확인된 응용프로그램의 Product ID에 해당합니다. 응용프로그램의 Product ID가 이 예제에서 사용된 ID와 다를 수도 있습니다.

  8. 이제 데이터베이스 스키마 버전 0에 데이터베이스 복사본이 있습니다. 이 데이터베이스 파일을 사용하면 격리된 저장소 탐색기의 스냅숏 복원(rs) 명령을 통해 로컬 데이터베이스를 업데이트 전 날짜로 롤백할 수 있습니다.

이 단원에서는 두 번째 버전의 응용프로그램 및 로컬 데이터베이스 스키마를 준비합니다. 버전 2에서는 각 작업의 색이 작업 우선 순위를 기준으로 변경될 수 있습니다.

이 기능을 구현하기 위해 다음 파일이 업데이트되거나 추가됩니다.

  • Model\ToDoDataContext.cs: 이 파일을 업데이트하여 새 우선 순위 열을 정의합니다.

  • ViewModel\ToDoViewModel.cs: 이 파일을 업데이트하여 새 작업에 유효한 우선 순위 목록을 제공합니다.

  • NewTaskPage.xaml and NewTaskPage.xaml.cs: 이 파일을 업데이트하여 새 작업과 연결된 우선 순위를 지정하기 위한 ListPicker 컨트롤을 추가합니다.

  • PriorityToColorConverter.cs: 이 파일을 추가하여 작업 우선 순위를 기본 페이지 UI에 표시된 작업에 바인딩할 수 있는 SolidColorBrush 개체로 변환합니다.

  • MainPage.xaml: 이 파일을 업데이트하여 작업 색을 해당 작업 우선 순위에 바인딩합니다.

  • App.xaml.cs: 이 파일을 수정하여 데이터베이스 업데이트 논리를 추가합니다.

버전 2를 준비하려면

  1. Model\ToDoDataContext.cs 파일에서 다음 코드를 ToDoItem 클래스에 추가합니다.

    // Define Priority: field, public property, and database column.
    // Added in Version 2 of the application.
    private int? _priority;
    
    [Column(CanBeNull = true)]
    public int? Priority
    {
        get { return _priority; }
        set
        {
            if (_priority != value)
            {
                NotifyPropertyChanging("Priority");
                _priority = value;
                NotifyPropertyChanged("Priority");
            }
        }
    }
    
    

    이 코드는 Priority라는 새 데이터베이스 열을 정의합니다. 이 코드가 클래스에 표시되는 순서는 중요하지 않습니다. CanBeNull 열 특성을 사용하면 데이터베이스의 기존 데이터가 새 열과 호환될 수 있습니다.

  2. ViewModel\ToDoViewModel.cs 파일에서 다음 코드를 ToDoViewModel 클래스에 추가합니다.

    // Valid priorities for new tasks.
    // Added in Version 2 of the application.
    private List<int> _prioritiesList = new List<int> { 1, 2, 3 };
    public List<int> PrioritiesList
    {
        get { return _prioritiesList; }
    }
    
  3. NewTaskPage.xaml 파일에서 ContentPanel라는 StackPanel의 categoriesListPicker 바로 아래에 다음 코드를 추가합니다.

    <!-- Added in Version 2 of the application. -->
    <TextBlock 
        Text="Priority"
        Style="{StaticResource PhoneTextNormalStyle}"
        />
    <toolkit:ListPicker
        x:Name="priorityListPicker"
        ItemsSource="{Binding PrioritiesList}">
    </toolkit:ListPicker>
    <!-- End of Version 2 update. -->
    
    

    이 코드는 새 작업과 연결된 우선 순위를 지정하기 위해 ListPicker 컨트롤을 추가합니다.

  4. NewTaskPage.xaml.cs 파일에서 newToDoItem 개체를 만드는 코드를 업데이트하여 Priority 속성을 다음과 같이 지정합니다.

    // Create a new task.
    ToDoItem newToDoItem = new ToDoItem
    {
        ItemName = newTaskNameTextBox.Text,
        Category = (ToDoCategory)categoriesListPicker.SelectedItem,
    
        // Set the priority of the new task to the specified priority.
        // Added in Version 2 of the application.
        Priority = (int)priorityListPicker.SelectedItem
    };
    
    
  5. 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 추가새 항목을 차례로 선택합니다.

  6. 새 항목 추가 창에서 코드 파일을 선택하고 파일 이름을 PriorityToColorConverter.cs로 지정합니다. 추가를 클릭합니다.

  7. PriorityToColorConverter.cs 파일에서 모든 코드를 다음과 같이 바꿉니다.

    using System;
    using System.Windows.Media;
    using System.Windows.Data;
    
    namespace LocalDatabaseSample
    {
        // Convert task priority to a brush that can be bound to in the UI.
        // Added in Version 2 of the application.
        public class PriorityToColorConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                // Allow for tasks that have no priority.
                int? priority = (int?)value;
    
                // Assign color based on priority.
                switch (priority)
                {
                    case null:
                        return new SolidColorBrush(Colors.White);
                    case 1:
                        return new SolidColorBrush(Colors.Red);
                    case 2:
                        return new SolidColorBrush(Colors.Yellow);
                    case 3:
                        return new SolidColorBrush(Colors.Green);
                    default:
                        return new SolidColorBrush(Colors.White);
                }
            }
    
            // Unused; required for IValueConverter implementation.
            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            { throw new NotImplementedException();}
        }
    }
    
    
  8. MainPage.xaml 파일에서 다음 특성을 phone:PhoneApplicationPage 요소에 추가합니다.

        xmlns:local="clr-namespace:LocalDatabaseSample"
    

    이 코드는 기본 페이지에서 사용할 PriorityToColorConverter에 필요한 네임스페이스를 추가합니다.

  9. MainPage.xaml에서 phone:PhoneApplicationPage.Resources 요소의 DataTemplate(ToDoListBoxItemTemplate) 위에 다음 요소를 추가합니다.

    <!-- Resource & namespace specified in Version 2 of the application. -->
    <local:PriorityToColorConverter x:Key="PriorityToColorConverter" />     
    
    

    이 코드는 기본 페이지에서 PriorityToColorConverter를 리소스로 추가합니다.

  10. MainPage.xaml의 DataTemplate(ToDoListBoxItemTemplate)에서 Foreground 속성을 다음과 같이 지정하여 TextBlock을 업데이트합니다.

    <!-- Foreground specified in Version 2 of the application. -->
    <TextBlock 
        Text="{Binding ItemName}" 
        FontSize="{StaticResource PhoneFontSizeLarge}" 
        Grid.Column="1" Grid.ColumnSpan="2" 
        VerticalAlignment="Top" Margin="-36, 12, 0, 0"
        Foreground="{Binding Priority, Converter={StaticResource PriorityToColorConverter}}"
        />
    
    

    이 코드는 PriorityToColorConverter 리소스를 기준으로 작업 텍스트의 전경색을 우선 순위에 바인딩합니다.

  11. App.xaml.cs 파일에서 다음 지시문을 페이지 맨 위에 추가합니다.

    // Directive for DatabaseSchemaUpdater
    // Added in Version 2 of the application.
    using Microsoft.Phone.Data.Linq;
    
    

    이 코드는 다음 단계 중 하나에서 DatabaseSchemaUpdater 개체를 만드는 데 사용됩니다.

  12. App.xaml.cs 파일에서 다음 코드를 App 클래스에 추가합니다.

    // The current version of the application.
    public static int APP_VERSION = 2;
    
    
  13. App.xaml.cs에서 db라는 ToDoDataContext에 대한 using 문을 다음과 같이 바꿉니다.

    using (ToDoDataContext db = new ToDoDataContext(DBConnectionString))
    {
        // Create the database if it does not exist.
        if (db.DatabaseExists() == false)
        {
            // Create the local database.
            db.CreateDatabase();
    
            // Prepopulate the categories.
            db.Categories.InsertOnSubmit(new ToDoCategory { Name = "Home" });
            db.Categories.InsertOnSubmit(new ToDoCategory { Name = "Work" });
            db.Categories.InsertOnSubmit(new ToDoCategory { Name = "Hobbies" });
    
            // Save categories to the database.
            db.SubmitChanges();
    
            // Set the new database version.
            DatabaseSchemaUpdater dbUpdater = db.CreateDatabaseSchemaUpdater();
            dbUpdater.DatabaseSchemaVersion = APP_VERSION;
            dbUpdater.Execute();
        }
        else
        {
            // Check whether a database update is needed.
            DatabaseSchemaUpdater dbUpdater = db.CreateDatabaseSchemaUpdater();
                                            
            if (dbUpdater.DatabaseSchemaVersion < APP_VERSION)
            {
                // Add the Priority column (added in version 2).
                dbUpdater.AddColumn<ToDoItem>("Priority");
    
                // Add the new database version.
                dbUpdater.DatabaseSchemaVersion = 2;
    
                // Perform the database update in a single transaction.
                dbUpdater.Execute();
            }
        }
    }
    
    

    이 코드는 if 문에 else 절을 추가하여 응용프로그램이 필요한 경우 데이터베이스를 업데이트할 수 있게 합니다. dbUpdater 개체에서 Execute 메서드가 호출될 때까지 변경 사항이 데이터베이스에 적용되지 않습니다.

  14. 빌드 메뉴에서 다시 빌드 옵션을 클릭하여 솔루션을 다시 빌드합니다. Visual Studio Express에 빌드 메뉴가 표시되지 않는 경우 도구 메뉴에서 설정을 클릭하고 전문가 설정을 선택하여 이 메뉴를 사용하도록 설정합니다.

  15. 로컬 데이터베이스 예제 응용프로그램에 대한 버전 2 업데이트를 완료했습니다. F5 키를 누르고 응용프로그램을 실행하여 응용프로그램 기능을 테스트합니다.

    참고참고:

    Visual Studio의 상태에 따라 에뮬레이터나 단말기에서 저장한 데이터가 이때 응용프로그램에 표시되지 않을 수도 있습니다. 다음 단원에서는 응용프로그램 버전 0의 데이터가 복원됩니다.

이 단원에서는 응용프로그램의 데이터베이스 업데이트 코드를 테스트합니다. 이 지점에 도달할 때의 Visual Studio 상태에 따라 데이터베이스 버전 0의 데이터가 에뮬레이터나 단말기에 표시되지 않을 수도 있습니다.

응용프로그램 업데이트를 시뮬레이션하려면 새 버전의 응용프로그램이 단말기에 배포된 후 격리된 저장소 탐색기를 사용하여 데이터베이스 버전 0을 복원합니다. Windows Phone 마켓플레이스에서 단말기의 응용프로그램을 업데이트하는 경우 응용프로그램 코드만 업데이트되고 격리된 저장소는 응용프로그램 업데이트 프로세스에서 수정되지 않습니다.

데이터베이스 업데이트를 테스트하려면

  1. 빌드 메뉴에서 다시 빌드 옵션을 클릭하여 솔루션을 다시 빌드합니다. Visual Studio Express에 빌드 메뉴가 표시되지 않는 경우 도구 메뉴에서 설정을 클릭하고 전문가 설정을 선택하여 이 메뉴를 사용하도록 설정합니다.

  2. F5 키를 눌러 디버깅을 시작합니다. 그러면 새 버전의 응용프로그램이 에뮬레이터나 단말기에 배포됩니다.

    참고참고:

    응용프로그램의 격리된 저장소 컨테이너에 복사하려면 격리된 저장소 탐색기에서 동일한 Product ID를 가진 응용프로그램 인스턴스가 하나 이상 에뮬레이터나 단말기에 있어야 합니다. 디버거를 실행하면 이 조건이 충족됩니다.

  3. 디버그 메뉴에서 디버깅 중지를 클릭합니다. 에뮬레이터를 닫거나 단말기의 테더링을 취소하지 마십시오. 그러면 응용프로그램이 닫히고 격리된 저장소에 있는 로컬 데이터베이스 파일의 제어가 해제됩니다.

  4. 격리된 저장소 탐색기를 사용하여 LocalDatabaseVersion0 폴더에서 에뮬레이터나 단말기로 버전 0 데이터베이스를 복원합니다. 자세한 내용은 방법: 격리된 저장소 탐색기 도구 사용을 참조하십시오. 다음 예제에서는 에뮬레이터에서 c:\LocalDatabaseVersion0\IsolatedStore\ToDo.sdf로 버전 0 데이터베이스 파일을 복사합니다.

    중요중요:

    데이터베이스를 성공적으로 복원하려면 이 명령을 수행할 때 디버거 사용 여부에 관계없이 응용프로그램이 실행되고 있지 않아야 합니다. 응용프로그램에 삭제 표식이 지정된 경우 단말기가 시작으로 이동할 때까지 뒤로 버튼을 눌러 응용프로그램 스택에서 제거해야 할 수도 있습니다.

    ISETool.exe rs xd 77a80316-384d-40dc-a8c3-c4054676e85c "C:\LocalDatabaseVersion0\IsolatedStore"
    

    GUID 값은 응용프로그램 매니페스트 파일에서 확인된 응용프로그램의 Product ID에 해당합니다. 응용프로그램의 Product ID가 이 예제에서 사용된 ID와 다를 수도 있습니다.

  5. 이제 새 버전의 응용프로그램이 데이터베이스 버전 0으로 실행되기 직전에 응용프로그램이 Windows Phone 마켓플레이스 업데이트를 시뮬레이션하는 상태입니다. 데이터베이스 업데이트 코드를 단계별로 실행하려면 App.xaml.cs 파일의 다음 코드 줄에 디버깅 중단점을 설정합니다.

    if (db.DatabaseExists() == false)
    
  6. F5 키를 눌러 디버깅을 시작합니다. 새 버전의 응용프로그램이 단말기에 다시 배포되고 데이터베이스 버전 1.0으로 실행되기 시작합니다.

  7. 디버거가 중단점에 도달한 후 과정 종료 버튼을 클릭하여 데이터베이스 업데이트 코드를 살펴봅니다. 데이터베이스가 업데이트되기 전후에 dbUpdater 개체의DatabaseSchemaVersion 속성을 관찰합니다(dbUpdater 개체 이름을 마우스로 가리킴).

    다음 예제에서는 Execute 메서드가 호출되기 전(빨간색 화살표)과 후(파란색 화살표) dbUpdater의 DatabaseSchemaVersion을 보여 줍니다.

    AP_Con_LocalDatabaseUpdate_Debugging
  8. 중단점을 제거하고 F5 키를 눌러 디버깅을 시작하고 응용프로그램을 계속 실행합니다. 다음 이미지와 같이 응용프로그램이 버전 0의 기준선으로 저장한 작업을 시작하고 표시합니다.

    AP_Con_LocalDatabaseUpdate_Baseline0

    응용프로그램 버전 0으로 만든 작업에 우선 순위 값이 연결되어 있지 않으므로 PriorityToColorConverter에서 White 색을 할당했습니다.

  9. 업데이트 테스트를 마쳤으면 디버깅을 중지합니다. 디버그 메뉴에서 디버깅 중지를 클릭합니다. 에뮬레이터를 닫거나 단말기의 테더링을 취소하지 마십시오. 그러면 응용프로그램이 닫히고 격리된 저장소에 있는 로컬 데이터베이스 파일의 제어가 해제됩니다.

이 단원에서는 응용프로그램 버전 2를 실행하고, 일부 작업을 데이터베이스에 추가하고, 다음 버전의 데이터베이스 업데이트 코드를 테스트하기 위해 데이터베이스 복사본을 저장합니다.

버전 2의 기준선 데이터베이스를 만들려면

  1. 응용프로그램 버전 2가 실행되고 있지 않으면 F5 키를 눌러 디버깅을 시작하고 응용프로그램을 테스트합니다.

  2. 에뮬레이터 또는 단말기의 응용프로그램 모음에서 추가 버튼을 탭하여 우선 순위와 완료 상태가 다른 새 작업을 응용프로그램에 추가합니다. 필요에 따라 버전 0 기준선에서 작업을 제거하여 새 작업에 사용할 공간을 확보합니다.

    다음 이미지는 버전 0에서 복원된 일부 작업과 응용프로그램의 새 우선 순위 기능을 설명하는 새 작업(task priority 1task priority 2 및 task priority 3)이 포함된 데이터베이스 버전 2를 보여 줍니다.

    AP_Con_LocalDatabaseUpdate_Baseline2
  3. 디버그 메뉴에서 디버깅 중지를 클릭합니다. 에뮬레이터를 닫거나 단말기의 테더링을 취소하지 마십시오.

  4. 컴퓨터에 LocalDatabaseVersion2라는 폴더를 만듭니다. 이 폴더는 데이터베이스 스키마 버전 2의 기준선 데이터베이스를 저장하는 데 사용됩니다.

  5. 격리된 저장소 탐색기를 사용하여 응용프로그램에서 LocalDatabaseVersion2 폴더로 로컬 데이터베이스를 복사합니다. 자세한 내용은 방법: 격리된 저장소 탐색기 도구 사용을 참조하십시오. 다음 예제에서는 에뮬레이터에서 c:\LocalDatabaseVersion2\IsolatedStore\ToDo.sdf로 데이터베이스 파일을 복사합니다.

    ISETool.exe ts xd 77a80316-384d-40dc-a8c3-c4054676e85c "C:\LocalDatabaseVersion2"
    

    GUID 값은 응용프로그램 매니페스트 파일에서 확인된 응용프로그램의 Product ID에 해당합니다. 응용프로그램의 Product ID가 이 예제에서 사용된 ID와 다를 수도 있습니다.

  6. 이제 데이터베이스 스키마 버전 2에 응용프로그램 복사본이 있습니다. 데이터베이스 스키마를 추가로 업데이트하려면 다음 단원에서 계속합니다.

이 단원에서는 세 번째 버전의 응용프로그램 및 로컬 데이터베이스 스키마를 준비합니다. 버전 3에서는 데이터베이스에 보조 인덱스를 추가하고 여러 업그레이드 경로를 고려하도록 데이터베이스 업데이트 논리를 준비하는 과정을 보여 줍니다.

중요중요:

고객이 응용프로그램의 모든 업데이트 설치를 선택하지 않을 수도 있습니다. 응용프로그램을 시작할 때 단말기의 데이터베이스 파일이 이전 응용프로그램 버전일 수 있다는 것을 고려해야 합니다.

버전 3을 준비하려면

  1. Model\ToDoDataContext.cs 파일에서 다음 지시문을 파일 맨 위에 추가합니다.

    // Directive for Index attribute.
    // Added in Version 3 of the application.
    using Microsoft.Phone.Data.Linq.Mapping;
    
    
  2. Model\ToDoDataContext.cs에서 다음 LINQ to SQL 매핑 특성을 ToDoItem 클래스의 [Table] 특성 바로 아래에 추가합니다.

    // Index added in version 3 of the application.
    [Index(Columns = "Priority", Name = "PriorityIndex")]
    

    이 코드는 우선 순위 열에 오름차순 인덱스를 추가합니다. 이 인덱스를 데이터베이스에 추가하는 것은 데모용일 뿐입니다. 해당 성능 이점을 이용하도록 응용프로그램을 업데이트하는 것은 이 항목의 범위를 벗어납니다.

  3. App.xaml.cs 파일에서 App 클래스의 APP_VERSION 속성을 업데이트합니다.

    // The current version of the application.
    public static int APP_VERSION = 3;
    
    
  4. App.xaml.cs에서 db라는 ToDoDataContext에 대한 using 문을 다음과 같이 업데이트합니다.

    using (ToDoDataContext db = new ToDoDataContext(DBConnectionString))
    {
        // Create the database if it does not exist.
        if (db.DatabaseExists() == false)
        {
            // Create the local database.
            db.CreateDatabase();
    
            // Prepopulate the categories.
            db.Categories.InsertOnSubmit(new ToDoCategory { Name = "Home" });
            db.Categories.InsertOnSubmit(new ToDoCategory { Name = "Work" });
            db.Categories.InsertOnSubmit(new ToDoCategory { Name = "Hobbies" });
    
            // Save categories to the database.
            db.SubmitChanges();
    
            // Set the new database version.
            DatabaseSchemaUpdater dbUpdater = db.CreateDatabaseSchemaUpdater();
            dbUpdater.DatabaseSchemaVersion = APP_VERSION;
            dbUpdater.Execute();
        }
        else
        {
            // Check whether a database update is needed.
            DatabaseSchemaUpdater dbUpdater = db.CreateDatabaseSchemaUpdater();
    
            if (dbUpdater.DatabaseSchemaVersion < APP_VERSION)
            {
                // Perform version 2.0 update, as applicable.
                if (dbUpdater.DatabaseSchemaVersion < 2)
                {
                    // Add the Priority column (added in version 2.0).
                    dbUpdater.AddColumn<ToDoItem>("Priority");
                }
    
                // Add the Priority index (added in version 3.0).
                dbUpdater.AddIndex<ToDoItem>("PriorityIndex");
    
                // Set the new database version.
                dbUpdater.DatabaseSchemaVersion = 3;
    
                // Perform the database update in a single transaction.
                dbUpdater.Execute();
            }
        }
    }
    
    

    이 코드는 else 절을 업데이트하여 PriorityIndex라는 보조 인덱스를 추가하고 필요한 경우 Priority 열을 추가합니다. 고객이 응용프로그램의 모든 업데이트 설치를 선택하지 않을 수도 있습니다. 응용프로그램을 시작할 때 단말기의 데이터베이스 파일이 이전 응용프로그램 버전일 수 있다는 것을 고려해야 합니다.

  5. 빌드 메뉴에서 다시 빌드 옵션을 클릭하여 솔루션을 다시 빌드합니다. Visual Studio Express에 빌드 메뉴가 표시되지 않는 경우 도구 메뉴에서 설정을 클릭하고 전문가 설정을 선택하여 이 메뉴를 사용하도록 설정합니다.

  6. 이제 응용프로그램에 대한 버전 3 업데이트를 완료했습니다. 이전 버전의 데이터베이스에서 데이터베이스 업데이트를 테스트하려면 다음 단원에서 계속합니다.

이 단원에서는 다양한 버전의 데이터베이스 스키마에서 응용프로그램 업데이트를 시뮬레이션하여 버전 3 데이터베이스 업데이트 논리를 테스트합니다. 고객이 응용프로그램 업데이트를 모두 설치하지 않을 수도 있습니다. 데이터베이스 업데이트 논리가 이전 버전의 데이터베이스 스키마에서 원하는 대로 수행되는지 확인해야 합니다.

버전 0에서 버전 3 업데이트를 테스트하려면

  • 데이터베이스 스키마 버전 0에 대해 버전 3 데이터베이스 업데이트 논리를 테스트합니다. 이 연습 데이터베이스 업데이트 테스트의 앞부분에서 설명한 프로세스를 사용하여 LocalDatabaseVersion0 폴더에 저장된 데이터베이스로 테스트합니다.

    예를 들어 다음 명령줄 문은 c:\LocalDatabaseVersion0\IsolatedStore\ToDo.sdf에서 에뮬레이터로 버전 0 데이터베이스 파일을 복사합니다.

    ISETool.exe rs xd 77a80316-384d-40dc-a8c3-c4054676e85c "C:\LocalDatabaseVersion0\IsolatedStore"
    

    GUID 값은 응용프로그램 매니페스트 파일에서 확인된 응용프로그램의 Product ID에 해당합니다. 응용프로그램의 Product ID가 이 예제에서 사용된 ID와 다를 수도 있습니다.

    버전 0 데이터베이스로 버전 3의 응용프로그램을 시작하면 버전 0 기준선으로 저장한 작업만 표시됩니다.

    AP_Con_LocalDatabaseUpdate_Baseline0

버전 2에서 버전 3 업데이트를 테스트하려면

  • 데이터베이스 스키마 버전 2에 대해 버전 3 데이터베이스 업데이트 논리를 테스트합니다. 이 연습 데이터베이스 업데이트 테스트의 앞부분에서 설명한 프로세스를 사용하여 LocalDatabaseVersion2 폴더에 저장된 데이터베이스로 테스트합니다.

    예를 들어 다음 명령줄 문은 c:\LocalDatabaseVersion2\IsolatedStore\ToDo.sdf에서 에뮬레이터로 버전 2 데이터베이스 파일을 복사합니다.

    ISETool.exe rs xd 77a80316-384d-40dc-a8c3-c4054676e85c "C:\LocalDatabaseVersion2\IsolatedStore"
    

    GUID 값은 응용프로그램 매니페스트 파일에서 확인된 응용프로그램의 Product ID에 해당합니다. 응용프로그램의 Product ID가 이 예제에서 사용된 ID와 다를 수도 있습니다.

    버전 2 데이터베이스로 버전 3의 응용프로그램을 시작하면 버전 2 기준선으로 저장한 작업만 표시됩니다.

    AP_Con_LocalDatabaseUpdate_Baseline2

이 단원에서는 격리된 저장소 탐색기를 사용하여 응용프로그램과 연결된 격리된 저장소 컨테이너를 지웁니다. 이전 버전의 데이터베이스 스키마로 응용프로그램을 테스트하는 동안 단말기에 이전 버전의 데이터베이스가 없는 새 고객의 환경을 테스트할 수도 있습니다. 격리된 저장소 탐색기를 사용하여 데이터베이스를 제거하는 것이 에뮬레이터를 다시 시작하거나 단말기에서 응용프로그램을 제거하는 것보다 편리합니다.

팁팁:

명령 창(Cmd.exe)에서 격리된 저장소 탐색기를 사용하는 경우 위쪽 및 아래쪽 화살표 키를 사용하여 명령 기록을 탐색하고 이전 명령에 신속하게 액세스 및 편집할 수 있습니다.

빈 폴더를 만들려면

  1. 기준선 데이터베이스 폴더 중 하나(예: LocalDatabaseVersion2)를 복사합니다.

  2. 폴더 이름을 LocalDatabaseEmpty로 바꿉니다.

  3. 로컬 데이터베이스 파일이 포함된 폴더로 이동합니다. 예를 들어 c:\LocalDatabaseEmpty\IsolatedStore입니다.

  4. ToDo.sdf라는 로컬 데이터베이스 파일을 삭제합니다.

  5. 이제 빈 격리된 저장소 컨테이너의 스냅숏을 만들었습니다. 에뮬레이터나 단말기의 응용프로그램에 이 폴더를 복원하면 응용프로그램의 격리된 저장소 컨테이너에서 로컬 데이터베이스 파일이 제거됩니다.

로컬 데이터베이스를 제거하려면

  • LocalDatabaseEmpty 폴더에 캡처된 빈 격리된 저장소 컨테이너를 복원합니다. 이 연습 데이터베이스 업데이트 테스트의 앞부분에서 설명한 프로세스와 유사한 프로세스를 사용합니다.

    예를 들어 다음 명령줄 문은 c:\LocalDatabaseEmpty\IsolatedStore에서 에뮬레이터로 빈 격리된 저장소 컨테이너를 복사합니다.

    ISETool.exe rs xd 77a80316-384d-40dc-a8c3-c4054676e85c "C:\LocalDatabaseEmpty\IsolatedStore"
    

    GUID 값은 응용프로그램 매니페스트 파일에서 확인된 응용프로그램의 Product ID에 해당합니다. 응용프로그램의 Product ID가 이 예제에서 사용된 ID와 다를 수도 있습니다.

    다음 이미지는 새로 설치를 시뮬레이션하여 LocalDatabaseEmpty 폴더를 복원한 후 응용프로그램 버전 3이 어떻게 표시되는지를 보여 줍니다.

    AP_Con_LocalDatabaseUpdate_Empty

    이제 로컬 데이터베이스 업데이트 연습을 완료했습니다.

반응형
Posted by 컴스터
,
반응형

데이터 형식

이 항목은 아직 평가되지 않았습니다.이 항목 평가

Microsoft SQL Server Compact 4.0 데이터베이스에 있는 테이블의 각 열은 열에 사용할 수 있는 데이터 형식을 지정하는 데이터 형식 집합을 지원합니다.

참고 참고

MicrosoftSQL Server와 SQL Server Compact 4.0 간에는 함수 실행 결과 오버플로나 언더플로가 발생하는 경우 데이터 형식을 확장하는 방식에 약간의 차이가 있을 수 있습니다.

SQL Server Compact 4.0는 다음과 같은 데이터 형식을 지원합니다.

데이터 형식

설명

bigint

-2^63(-9,223,372,036,854,775,808)부터 2^63-1(9,223,372,036,854,775,807)까지의 정수 데이터입니다. 저장소 크기는 8바이트입니다.

integer

-2^31(-2,147,483,648)부터 2^31-1(2,147,483,647)까지의 정수 데이터입니다.

저장소 크기는 4바이트입니다.

smallint

-32,768부터 32,767까지의 정수 데이터입니다. 저장소 크기는 2바이트입니다.

tinyint

0부터 255까지의 정수 데이터입니다. 저장소 크기는 1바이트입니다.

bit

값이 1 또는 0인 정수 데이터입니다.

저장소 크기는 1비트입니다.

numeric (p, s)

Synonyms:

decimal(p,s) and dec (p,s)

-10^38+1부터 10^38-1까지의 고정 정밀도 및 소수 자릿수 데이터입니다. 변수는 정밀도를 지정하며 1에서 38 사이의 숫자가 될 수 있습니다.s 변수는 소수 자릿수를 지정하며 0에서 p 사이의 숫자가 될 수 있습니다.

저장소 크기는 19바이트입니다.

money

정확도가 통화 단위의 10/1000인 (-2^63/10000)(-922,337,203,685,477.5808)부터 2^63-1(922,337,203,685,477.5807)까지의 통화 데이터 값입니다. 저장소 크기는 8바이트입니다.

float

-1.79E+308부터 1.79E+308까지의 부동 소수점 숫자 데이터입니다.

저장소 크기는 8바이트입니다.

real

-3.40E+38부터 3.40E+38까지의 부동 정밀도 숫자 데이터입니다.

저장소 크기는 4바이트입니다.

datetime

정확도가 1/300초 또는 3.33밀리초인 1753년 1월 1일부터 9999년 12월 31일까지의 날짜 및 시간 데이터입니다. 값은 .000, .003 또는 .007밀리초의 증가값으로 반올림됩니다.

두 개의 4바이트 정수로 저장됩니다. 처음 4바이트는 base date인 1900년 1월 1일 전후의 날짜 수를 저장합니다. 기준 날짜는 시스템의 참조 날짜입니다. 1753년 1월 1일 이전의 datetime 값은 허용되지 않습니다. 나머지 4바이트는 자정 이후의 시간을 밀리초로 표시하여 저장합니다. 유효한 초의 범위는 0-59입니다.

형식
yyyy/mm/dd hh:mm:ss1947/08/15 03:33:20
mm/dd/yyyy hh:mm:ss04/15/1947 03:33:20
dd mmm yyyy hh:mm:ss15 Jan 1947 03:33:20
dd mmmm yyyy h:mm:ss15 January 1947 03:33:20

national character(n)

Synonym:nchar(n)

최대 길이가 4000자인 고정 길이 유니코드 데이터입니다. 기본 길이 = 1입니다. 저장소 크기(바이트 단위)는 입력한 문자 수의 두 배입니다.

national character varying(n)

Synonym:nvarchar(n)

길이가 1에서 4000자까지인 가변 길이 유니코드 데이터입니다. 기본 길이 = 1입니다. 저장소 크기(바이트 단위)는 입력한 문자 수의 두 배입니다.

ntext¹

최대 길이가 (2^30-2)/2(536,870,911)자인 가변 길이 유니코드 데이터입니다. 저장소 크기(바이트 단위)는 입력한 문자 수의 두 배입니다.

참고 참고
ntext 는 문자열 함수에서 더 이상 지원되지 않습니다.

nchar

n자인 고정 길이 유니코드 문자 데이터입니다. n은 1과 4,000 사이의 값이어야 합니다. 저장소 크기는 n바이트의 두 배입니다.

binary(n)

최대 길이가 8000바이트인 고정 길이 이진 데이터입니다. 기본 길이 = 1입니다.

저장소 크기는 형식에 선언된 길이(바이트 단위)로 고정입니다.

varbinary(n)

최대 길이가 8000바이트인 가변 길이 이진 데이터입니다. 기본 길이 = 1입니다.

저장소 크기는 다양하며 값의 길이(바이트 단위)입니다.

image¹

최대 길이가 2^30-1(1,073,741,823)바이트인 가변 길이 이진 데이터입니다.

저장소는 값의 길이(바이트 단위)입니다.

uniqueidentifier

GUID(Globally Unique Identifier)입니다. 저장소 크기는 16바이트입니다.

IDENTITY [(s, i)]

데이터 열의 속성이며 고유한 데이터 형식은 아닙니다.

정수 데이터 형식의 데이터 열만 ID 열로 사용할 수 있습니다. 테이블에는 ID 열이 하나만 있을 수 있습니다. 초기값과 증가값을 지정할 수 있으며 열은 업데이트할 수 없습니다.

s(초기값) = 시작 값

i(증가값) = 증가값

ROWGUIDCOL

데이터 열의 속성이며 고유한 데이터 형식은 아닙니다. uniqueidentifier 데이터 형식을 사용하여 정의하는 테이블의 열입니다. 테이블에는 ROWGUIDCOL 열이 하나만 있을 수 있습니다.

Timestamp/rowversion

자동으로 생성된 고유 이진 숫자입니다.

저장소 크기는 8바이트입니다.

¹SQL Server Compact 4.0에서 바이트 수가 256을 초과하면 Ntext 및 이미지 데이터가 새 데이터 페이지에 저장됩니다. SQL Server Compact 4.0 데이터베이스는 바이트 단위가 아닌 페이지 단위로 압축되기 때문에 이 경우 데이터베이스의 압축 수준에 영향을 줄 수 있습니다.

SQL Server Compact 4.0에서 변환해야 할 SQL Server 데이터 형식에 대한 자세한 내용은 SQL Server Compact와 SQL Server의 차이점을 참조하십시오.

반응형
Posted by 컴스터
,
반응형

방법: Windows Phone의 응용프로그램 제목 지역화

Windows Phone
이 항목은 아직 평가되지 않았습니다.이 항목 평가

2012-02-09

사용자가 시작 화면에 응용프로그램을 고정하면 응용프로그램 모음과 응용프로그램 타일에 응용프로그램 제목이 표시됩니다. 응용프로그램 제목 지역화는 선택 사항입니다. 일부 개발자는 브랜딩 이유로 응용프로그램 제목을 지역화하지 않을 수도 있습니다.

응용프로그램 목록이나 응용프로그램 타일에 표시되는 응용프로그램 제목을 지역화하려면 응용프로그램의 각 대상 표시 언어에 대해 리소스 전용 DLL을 만들어야 합니다. Windows Phone 에서 지원되는 표시 언어의 전체 목록을 보려면 Windows Phone에 대한 문화권 및 언어 지원을 참조하십시오. 리소스 전용 DLL에는 응용프로그램 목록과 응용프로그램 타일의 응용프로그램 제목을 지역화하는 데 사용되는 리소스 문자열만 포함되어야 합니다.

다음 스크린샷은 응용프로그램 목록 및 응용프로그램 타일 컨텍스트에서 응용프로그램 제목이 사용되는 위치를 보여 줍니다.

응용프로그램 목록의 제목:

시작 화면에 고정된 응용프로그램 타일의 제목:

지역화된 제목이 있는 앱 목록지역화된 제목이 있는 시작 화면

이 절차를 완료하려면 Windows Phone 응용프로그램 프로젝트가 필요합니다. 기존 프로젝트를 사용하거나, 이러한 절차를 테스트하는 데 사용할 빈 Silverlight Windows Phone 응용프로그램을 만들 수 있습니다. 새 프로젝트를 만드는 방법에 대한 자세한 내용은 방법: Windows Phone용 첫 번째 Silverlight 응용프로그램 만들기를 참조하십시오.

다음 단원에서는 응용프로그램 목록과 응용프로그램 타일에 사용할 응용프로그램 제목을 지역화하는 프로세스를 안내합니다.

이 절차에서는 AppResLib.dll이라는 리소스 전용 DLL을 생성하는 프로젝트를 만듭니다.

참고참고:

여러 가지 방법으로 Windows Phone 응용프로그램과 지역화를 위한 리소스 DLL 프로젝트 및 파일을 구성할 수 있습니다. 여기에 제공된 방법은 모든 버전의 Visual Studio에서 올바르게 작동하는 단순한 방법입니다.

언어 리소스 DLL 프로젝트를 만들려면

  1. 파일 메뉴에서 새로 만들기를 가리킨 다음 프로젝트를 클릭합니다.

    새 프로젝트 대화 상자가 나타납니다.

  2. 왼쪽 창에서 설치된 템플릿을 클릭하고 Visual C++를 확장한 다음 Win32를 클릭합니다.

  3. 프로젝트 형식 목록에서 Win32 프로젝트를 클릭합니다.

  4. 이름 상자에 AppResLib를 입력합니다.

  5. 위치 상자에 프로젝트의 위치를 입력합니다.

    참고참고:

    이 절차에서는 임의 위치에 AppResLib 프로젝트를 만들 수 있습니다.

  6. 확인을 클릭합니다.

    Win32 응용프로그램 마법사가 나타납니다.

  7. 왼쪽 창에서 응용프로그램 설정을 클릭합니다.

  8. 응용프로그램 형식에서 DLL을 선택합니다.

  9. 추가 옵션에서 빈 프로젝트를 선택합니다.

  10. 마침을 클릭합니다.

    새 DLL 프로젝트가 생성되고 Visual Studio에서 열립니다.

  11. 솔루션 탐색기에서 새 DLL 프로젝트를 선택합니다.

  12. 프로젝트 메뉴에서 속성을 선택합니다.

    속성 페이지 대화 상자가 나타납니다.

  13. 왼쪽 창에서 구성 속성링커를 차례로 확장하고 고급을 클릭합니다.

  14. 진입점 없음 속성을 선택하고 속성 값의 오른쪽에 있는 드롭다운 화살표를 클릭한 다음 예(/NOENTRY)를 클릭합니다.

    참고참고:

    /NOENTRY는 링커가 _main에 대한 참조를 DLL에 연결하지 않도록 합니다. 리소스 전용 DLL을 만들려면 이 옵션이 필요합니다.

  15. 확인을 클릭합니다.

  16. 프로젝트를 저장하고 빌드합니다.

이 절차에서는 응용프로그램의 언어 중립 이름이 포함된 리소스 문자열 테이블을 DLL 프로젝트에 추가합니다.

응용프로그램에 대한 언어 중립 리소스 문자열을 만들려면

  1. 솔루션 탐색기에서 새 DLL 프로젝트를 선택합니다.

  2. 프로젝트 메뉴에서 리소스 추가를 클릭합니다.

    리소스 추가 대화 상자가 나타납니다.

  3. 리소스 형식 목록에서 문자열 테이블을 선택하고 새로 만들기를 클릭합니다.

    리소스 문자열 테이블이 열립니다.

  4. 다음 속성을 가진 리소스 문자열 두 개를 만듭니다.

    ID

    캡션

    AppTitle

    100

    응용프로그램 목록에 표시될 응용프로그램의 언어 중립 이름입니다.

    AppTileString

    200

    시작 화면에 고정할 경우 응용프로그램 타일에 표시될 응용프로그램의 언어 중립 이름입니다.

  5. DLL 프로젝트를 저장하고 빌드합니다.

  6. Windows 탐색기에서 방금 빌드한 AppResLib.dll 파일을 찾습니다.

  7. Windows Phone 응용프로그램 프로젝트 파일이 포함된 디렉터리에 AppResLib.dll 파일을 복사합니다.

    팁팁:

    기본 Windows Phone 프로젝트 구조를 사용하는 경우 App.xaml 파일이 포함된 것과 동일한 디렉터리입니다.

이 절차에서는 특정 언어 이름을 포함하도록 리소스 문자열 테이블을 편집합니다. DLL 파일의 이름을 바꾸고 해당 위치에 복사합니다.

응용프로그램에 대한 첫 번째 특정 언어 리소스 문자열을 만들려면

  1. 리소스 문자열을 편집하고 속성을 다음과 같이 설정합니다.

    ID

    캡션

    AppTitle

    100

    응용프로그램 목록에 표시될 응용프로그램의 영어(미국) 이름입니다.

    AppTileString

    200

    시작 화면에 고정할 경우 응용프로그램 타일에 표시될 응용프로그램의 영어(미국) 이름입니다.

  2. DLL 프로젝트를 저장하고 빌드합니다.

  3. Windows 탐색기에서 방금 빌드한 AppResLib.dll 파일을 찾습니다.

  4. DLL 파일의 이름을 AppResLib.dll.0409.mui로 바꿉니다.

  5. Windows Phone 응용프로그램 프로젝트 파일이 포함된 디렉터리에 AppResLib.dll.0409.mui 파일을 복사합니다.

    팁팁:

    빌드 후 이벤트를 사용하여 파일의 이름을 바꾸고 이동할 수 있습니다. 다음 문자열을 프로젝트 속성의 구성 속성,빌드 이벤트빌드 후 이벤트 아래에 복사합니다. copy "$[OutputPath]$[DLLProjectName].dll" "$[WindowsPhoneApplicationPath]\AppResLib.dll.0409.mui"

응용프로그램에 대한 추가 언어 리소스 문자열을 만들려면

  • 다음 표의 정보를 사용하여 DLL 파일의 이름을 바꿔서 이전 절차를 반복합니다. 각 DLL 파일 이름은 AppResLib.dll.[locale ID].mui 형식을 사용합니다.

    참고참고:

    각 Windows Phone 버전에서 지원되는 표시 언어의 전체 목록을 보려면 Windows Phone에 대한 문화권 및 언어 지원을 참조하십시오.

    문화권 이름

    문화권 코드

    DLL 파일 이름

    중국어 간체(중국)

    zh-CN

    AppResLib.dll.0804.mui

    중국어 번체(대만)

    zh-TW

    AppResLib.dll.0404.mui

    체코어(체코)

    cs-CZ

    AppResLib.dll.0405.mui

    덴마크어(덴마크)

    da-DK

    AppResLib.dll.0406.mui

    네덜란드어(네덜란드)

    nl-NL

    AppResLib.dll.0413.mui

    영어(영국)

    en-GB

    AppResLib.dll.0809.mui

    영어(미국)

    en-US

    AppResLib.dll.0409.mui

    핀란드어(핀란드)

    fi-FI

    AppResLib.dll.040b.mui

    프랑스어(프랑스)

    fr-FR

    AppResLib.dll.040c.mui

    독일어(독일)

    de-DE

    AppResLib.dll.0407.mui

    그리스어(그리스)

    el-GR

    AppResLib.dll.0408.mui

    헝가리어(헝가리)

    hu-HU

    AppResLib.dll.040e.mui

    이탈리아어(이탈리아)

    it-IT

    AppResLib.dll.0410.mui

    일본어(일본)

    ja-JP

    AppResLib.dll.0411.mui

    한국어(대한민국)

    ko-KR

    AppResLib.dll.0412.mui

    노르웨이어(노르웨이)

    nb-NO

    AppResLib.dll.0414.mui

    폴란드어(폴란드)

    pl-PL

    AppResLib.dll.0415.mui

    포르투갈어(브라질)

    pt-BR

    AppResLib.dll.0416.mui

    포르투갈어(포르투갈)

    pt-PT

    AppResLib.dll.0816.mui

    러시아어(러시아)

    ru-RU

    AppResLib.dll.0419.mui

    스페인어(스페인)

    es-ES

    AppResLib.dll.0c0a.mui

    스웨덴어(스웨덴)

    sv-SE

    AppResLib.dll.041d.mui

    주의주의:

    Windows Phone 응용프로그램 프로젝트 파일이 포함된 디렉터리에 MUI 파일을 복사해야 합니다.

Windows Phone 응용프로그램에서 지역화된 리소스 문자열을 사용하려면

  1. 솔루션 탐색기에서 Windows Phone 응용프로그램 프로젝트를 선택합니다.

  2. 프로젝트 메뉴에서 기존 항목 추가를 클릭합니다.

    기존 항목 추가 대화 상자가 나타납니다.

  3. AppResLib.dll 파일과 모든 AppResLib.dll.*.mui 파일을 선택하고 추가를 클릭합니다.

    파일이 Windows Phone 응용프로그램 프로젝트에 추가됩니다.

  4. 솔루션 탐색기에서 가져온 DLL 파일을 선택하고 속성 창에서 Build Action 속성을 Content로 설정합니다.

  5. 솔루션 탐색기에서 속성을 확장하고 WMAppManifest.xml을 두 번 클릭합니다.

  6. 응용프로그램 목록에 사용되는 응용프로그램 제목에 위성 DLL의 AppTitle 리소스 문자열을 사용하도록 WMAppManifest.xml 파일을 수정합니다. 코드가 다음 위치에서 강조 표시됩니다.

    <App xmlns=""
         ProductID="{product id}"
         Title="@AppResLib.dll,-100"
         RuntimeType="Silverlight"
         Version="1.0.0.0"
         Genre="apps.normal"
         Author="author"
         Description="description"
         Publisher="publisher">
    
    
  7. 응용프로그램 타일에 사용되는 응용프로그램 제목에 위성 DLL의 AppTileString 리소스 문자열을 사용하도록 WMAppManifest.xml 파일을 수정합니다. 코드가 다음 위치에서 강조 표시됩니다.

    <PrimaryToken TokenID="WindowsPhoneApplicationToken" TaskName="_default">
      <TemplateType5>
        <BackgroundImageURI IsRelative="true" IsResource="false">Background.png</BackgroundImageURI>
        <Count>0</Count>
        <Title>@AppResLib.dll,-200</Title>
      </TemplateType5>
    </PrimaryToken>
    
  8. Windows Phone 응용프로그램을 저장하고 빌드합니다.

지역화된 응용프로그램 제목을 테스트하려면 방법: Windows Phone용 지역화된 응용프로그램 테스트의 단계를 따릅니다.

반응형
Posted by 컴스터
,
반응형

Windows Phone은 XAML과 코드에서 모두 사용할 수 있는 키가 지정된 개체 사전인 리소스 사전을 테마 리소스에 사용합니다. 이 단원에서는 Windows Phone 리소스 사전에서 사용할 수 있는 테마 관련 속성에 대한 정보를 제공합니다. 응용프로그램은 여기에 공개된 속성에 액세스하고 XAML 코드를 사용하여 속성을 컨트롤에 바인딩할 수 있습니다. 이러한 리소스는 런타임에 응용프로그램에 추가됩니다.

참고참고:

테마 리소스에 할당되는 특정 값은 최종 사용자가 단말기에 대해 선택한 테마 컬러와 배경색에 따라 달라질 수 있습니다. 이러한 값이 지정되는 위치 및 다른 테마를 선택할 경우의 결과에 대한 자세한 내용은 Windows Phone의 테마 개요를 참조하십시오.

다음 표는 Windows Phone에서 사용할 수 있는 테마 속성을 표시하고 정의합니다. 테마 속성은 컨트롤 속성을 사용하여 디자이너에서 적용하거나 {StaticResource} 태그 확장을 사용하여 XAML을 통해 적용할 수 있습니다. XAML을 통해 적용하는 경우 이미 정의된 리소스에 대한 참조를 평가하여 모든 XAML 속성 특성에 대한 값을 제공합니다. 이러한 리소스를 컨트롤에 바인딩하는 방법에 대한 자세한 내용은 방법: Windows Phone의 테마 리소스 적용을 참조하십시오.

이 항목에서는 다음 테마 속성에 대해 설명합니다.

  1. 브러시 리소스

  2. 색 리소스

  3. 글꼴 이름

  4. Thickness

  5. 글꼴 크기

  6. 텍스트 스타일

  7. 테마 표시 유형 및 불투명도

브러시 리소스

이 표에서는 적용할 수 있는 다양한 브러시를 표시하고 설명합니다.

이름

Type

설명

PhoneAccentBrush

SolidColorBrush

관심 있는 항목을 선택할 전경색

PhoneForegroundBrush

SolidColorBrush

기본 전경색 및 테두리 색

PhoneBackgroundBrush

SolidColorBrush

Page 및 기타 컨트롤의 기본 배경

PhoneContrastBackgroundBrush

SolidColorBrush

대비 요소의 배경

PhoneContrastForegroundBrush

SolidColorBrush

대비 요소의 전경

PhoneDisabledBrush

SolidColorBrush

사용하지 않도록 설정된 전경 및 색

PhoneSubtleBrush

SolidColorBrush

은은한 전경 및 테두리

TransparentBrush

SolidColorBrush

배경 및 터치 대상에 사용되는 100% 투명 브러시

PhoneSemitransparentBrush

SolidColorBrush

이미지 배경에 대비를 제공하는 데 사용되는 부분 투명 배경 브러시

PhoneChromeBrush

SolidColorBrush

응용프로그램 모음 색을 일치시키는 데 사용

 

TextBox 브러시

이름

Type

설명

PhoneTextBoxBrush

SolidColorBrush

TextBox 컨트롤의 브러시

PhoneTextCaretBrush

SolidColorBrush

TextBox 캐럿의 브러시

PhoneTextBoxForegroundBrush

SolidColorBrush

TextBox 컨트롤 전경의 브러시

PhoneTextBoxEditBackgroundBrush

SolidColorBrush

TextBox 컨트롤 편집 배경의 브러시

PhoneTextBoxEditBorderBrush

SolidColorBrush

TextBox 컨트롤 편집 테두리의 브러시

PhoneTextBoxReadOnlyBrush

SolidColorBrush

TextBox 컨트롤 읽기 전용 상태의 브러시

PhoneTextBoxSelectionForegroundBrush

SolidColorBrush

TextBox 컨트롤 선택 전경의 브러시

 

RadioButton 및 CheckBox 브러시

이름

Type

설명

PhoneRadioCheckBoxBrush

SolidColorBrush

RadioButton 및 CheckBox의 브러시

PhoneRadioCheckBoxDisabledBrush

SolidColorBrush

사용하지 않도록 설정된 RadioButton 및 CheckBox 상태의 브러시

PhoneRadioCheckBoxCheckBrush

SolidColorBrush

CheckBox 선택의 브러시

PhoneRadioCheckBoxCheckDisabledBrush

SolidColorBrush

사용하지 않도록 설정된 CheckBox 선택의 브러시

PhoneRadioCheckBoxPressedBrush

SolidColorBrush

RadioButton 및 CheckBox 누른 상태의 브러시

PhoneRadioCheckBoxPressedBorderBrush

SolidColorBrush

RadioButton 및 CheckBox 누른 상태의 브러시

색 리소스

이 표에서는 브러시 리소스를 통해 적용할 수 있는 다양한 색을 표시하고 설명합니다.

참고참고:

색을 직접 사용하거나 수정하는 대신 브러시 리소스를 사용해야 합니다. 응용프로그램에서 브러시 값은 수정할 수 있지만 색은 수정할 수 없기 때문입니다.

이름

Type

설명

PhoneBackgroundColor

Color

Page 및 기타 컨트롤의 기본 배경

PhoneForegroundColor

Color

기본 전경색 및 테두리 색

PhoneDisabledColor

Color

사용하지 않도록 설정된 전경 및 색

PhoneSubtleColor

Color

은은한 전경 및 테두리

PhoneAccentColor

Color

관심 있는 항목을 선택할 전경색

PhoneContrastBackgroundColor

Color

대비 요소의 배경

PhoneContrastForegroundColor

Color

대비 요소의 전경

PhoneChromeColor

Color

상태 표시줄 및 응용프로그램 모음의 색

PhoneSemitransparentColor

Color

이미지 배경에 대비를 제공하는 데 사용되는 부분 투명 색

 

TextBox 색

이름

Type

설명

PhoneTextBoxColor

Color

TextBox 컨트롤의 색

PhoneTextCaretColor

Color

TextBox 캐럿의 색

PhoneTextBoxForegroundColor

Color

TextBox 컨트롤 전경색

PhoneTextBoxEditBackgroundColor

Color

TextBox 컨트롤 편집 배경색

PhoneTextBoxEditBorderColor

Color

TextBox 컨트롤 편집 테두리의 색

PhoneTextBoxReadOnlyColor

Color

TextBox 컨트롤 읽기 전용 상태의 색

PhoneTextBoxSelectionForegroundColor

Color

TextBox 컨트롤 선택 전경색

 

RadioButton 및 CheckBox 색

이름

Type

설명

PhoneRadioCheckBoxColor

Color

RadioButton 및 CheckBox의 색

PhoneRadioCheckBoxDisabledColor

Color

사용하지 않도록 설정된 RadioButton 및 CheckBox 상태의 색

PhoneRadioCheckBoxCheckColor

Color

CheckBox 선택의 색

PhoneRadioCheckBoxCheckDisabledColor

Color

사용하지 않도록 설정된 CheckBox 선택의 색

PhoneRadioCheckBoxPressedColor

Color

RadioButton 및 CheckBox 누른 상태의 색

PhoneRadioCheckBoxPressedBorderColor

Color

RadioButton 및 CheckBox 누른 상태의 색

글꼴 이름

이 표에서는 적용할 수 있는 다양한 글꼴 이름을 표시하고 설명합니다. 특성 = FontFamily

이름

Type

PhoneFontFamilyNormal

글꼴 패밀리

Segoe WP

PhoneFontFamilyLight

글꼴 패밀리

Segoe WP Light

PhoneFontFamilySemiLight

글꼴 패밀리

Segoe WP Semilight

PhoneFontFamilySemiBold

글꼴 패밀리

Segoe WP Semibold

Thickness

이 표에서는 UI 요소에 적용할 수 있는 두께를 표시하고 설명합니다. 특성 = BorderThickness, Margin, Padding

이름

Type

PhoneHorizontalMargin

BorderThickness, Margin, Padding

12, 0

PhoneVerticalMargin

BorderThickness, Margin, Padding

0, 12

PhoneMargin

BorderThickness, Margin, Padding

12

PhoneTouchTargetOverhang

BorderThickness, Margin, Padding

12

PhoneTouchTargetLargeOverhang

BorderThickness, Margin, Padding

12, 20

PhoneTextBoxInnerMargin

BorderThickness, Margin, Padding

1,2

PhonePasswordBoxInnerMargin

BorderThickness, Margin, Padding

3,2

PhoneBorderThickness

BorderThickness, Margin, Padding

3

PhoneStrokeThickness

BorderThickness, Margin, Padding

3

글꼴 크기

이 표에서는 적용할 수 있는 다양한 글꼴 크기를 표시하고 설명합니다. 특성 = FontSize

이름

Type

설명

PhoneFontSizeSmall

Double

18.667

PhoneFontSizeNormal

Double

20

PhoneFontSizeMedium

Double

22.667

PhoneFontSizeMediumLarge

Double

25.333

PhoneFontSizeLarge

Double

32

PhoneFontSizeExtraLarge

Double

42.667

PhoneFontSizeExtraExtraLarge

Double

72

PhoneFontSizeHuge

Double

186.667

텍스트 스타일

다음 표에서는 TextBlock 컨트롤에 적용할 수 있는 텍스트 스타일 선택 항목을 제공합니다. 특성 = Style

팁팁:

Windows Phone용 Expression Blend 을 사용하여 텍스트 스타일을 개체에 적용하기 전에 미리 볼 수 있습니다. 자세한 내용은 Windows Phone용 Expression Blend 개요를 참조하십시오.

이름

적용 대상:

Type

설명

PhoneTextBlockBase

TextBlock

Style

FontFamily: PhoneFontFamilyNormal

FontSize: PhoneFontSizeNormal

Foreground: PhoneForegroundBrush

Margin: PhoneHorizontalMargin

PhoneTextNormalStyle

TextBlock

Style

BasedOn: PhoneTextBlockBase

PhoneTextSubtleStyle

TextBlock

Style

BasedOn: PhoneTextBlockBase

Foreground: PhoneSubtleBrush

PhoneTextTitle1Style

TextBlock

Style

BasedOn: PhoneTextBlockBase

FontFamily: PhoneFontFamilySemiLight

FontSize: PhoneFontSizeExtraExtraLarge

PhoneTextTitle2Style

TextBlock

Style

BasedOn: PhoneTextBlockBase

FontFamily:PhoneFontFamilySemiLight

FontSize: PhoneFontSizeLarge

PhoneTextTitle3Style

TextBlock

Style

BasedOn: PhoneTextBlockBase

FontFamily: PhoneFontFamilySemiLight

FontSize: PhoneFontSizeMedium

PhoneTextSmallStyle

TextBlock

Style

BasedOn: PhoneTextBlockBase

FontSize: PhoneFontSizeSmall

Foreground: PhoneSubtleBrush

PhoneTextLargeStyle

TextBlock

Style

BasedOn: PhoneTextBlockBase

FontFamily: PhoneFontFamilySemiLight

FontSize: PhoneFontSizeLarge

PhoneTextExtraLargeStyle

TextBlock

Style

BasedOn: PhoneTextBlockBase

FontFamily: PhoneFontFamilySemiLight

FontSize: PhoneFontSizeExtraLarge

PhoneTextGroupHeaderStyle

TextBlock

Style

BasedOn: PhoneTextBlockBase

FontFamily: PhoneFontFamilySemiLight

FontSize: PhoneFontSizeLarge

Foreground: PhoneSubtleBrush

PhoneTextContrastStyle

TextBlock

Style

BasedOn: PhoneTextBlockBase

FontFamily: PhoneFontFamilySemiBold

Foreground: PhoneContrastForegroundBrush

PhoneTextAccentStyle

TextBlock

Style

BasedOn: PhoneTextBlockBase

FontFamily: PhoneFontFamilySemiBold

Foreground: PhoneAccentBrush

PhoneTextHugeStyle

TextBlock

Style

BasedOn: PhoneTextBlockBase

FontFamily: PhoneFontFamilyLight

FontSize: PhoneFontSizeHuge

테마 표시 유형 및 불투명도

어둡고 밝은 테마 배경의 표시 유형 및 불투명도를 조정하는 데 사용할 수 있는 리소스도 있습니다.

Visibility

이름

Type

설명

PhoneDarkThemeVisibility

Visibility

어두운 테마에서 표시하고 밝은 테마에서 축소

PhoneLightThemeVisibility

Visibility

밝은 테마에서 표시하고 어두운 테마에서 축소

 

Opacity

이름

Type

설명

PhoneDarkThemeOpacity

Double

어두운 테마에서는 1이고 밝은 테마에서는 0

PhoneLightThemeOpacity

Double

어두운 테마에서는 0이고 밝은 테마에서는 1


반응형
Posted by 컴스터
,
반응형

<ScrollViewer VerticalAlignment="Center"

                          HorizontalScrollBarVisibility="Auto"

                          VerticalScrollBarVisibility="Disabled">

                <ItemsControl >

                    <ItemsControl.ItemTemplate>

                        <DataTemplate>


                     <!--       템플릿 내용......  -->

                            

                        </DataTemplate>

                    </ItemsControl.ItemTemplate>

                    

  <!--가로로 패널바꾸기 -->

                    <ItemsControl.ItemsPanel>

                        <ItemsPanelTemplate>

                            <StackPanel Orientation="Horizontal"/>

                        </ItemsPanelTemplate>

                    </ItemsControl.ItemsPanel>

                </ItemsControl>

            </ScrollViewer>

반응형
Posted by 컴스터
,
반응형

메인페이지에서 OnNavigatedFrom 을 오버라이드 하여 서브페이지로 접근하여 값을 넘긴다.


protected override void OnNavigatedFrom(NavigationEventArgs args)

{

if(args.Content is SubPage)

{

(args.Content as SubPage).subMember = passingValue;

}


base.OnNavigatedTo(args)

}

반응형
Posted by 컴스터
,
반응형

서브페이지에서 OnNavigatedFrom 을 오버라이드 해서 메인페이지에 접근한다.


protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs args)

{

if (args.Content is MainPage)

     {

           (args.Content as MainPage).mainPageMember = passingValue;

}

            

base.OnNavigatedFrom(args);

}

반응형
Posted by 컴스터
,


반응형