내보내기(0) 인쇄
모두 확장

방법: Windows Phone의 알람 및 미리 알림 만들기

2012-02-09

AlarmReminder 클래스를 사용합니다. 이들 클래스는 예약된 알림을 만들어 시스템에 등록하기 위해 ScheduledNotificationScheduledActionService 클래스에서 상속받습니다. 알람 및 미리 알림은 미래의 지정된 시간에 실행되도록 예약되며 반복 일정으로 실행되도록 구성할 수 있습니다. 미리 알림이 실행될 때 응용프로그램이 지정하는 제목과 추가 텍스트 콘텐츠가 표시되는 대화 상자가 실행됩니다. 사용자가 미리 알림 UI를 탭하면 응용프로그램이 실행되고 지정한 페이지로 이동됩니다. 응용프로그램이 실행되면 쿼리 문자열 매개 변수를 사용하여 응용프로그램에 정보를 전달할 수 있습니다. 알람이 실행되면 제공한 추가 텍스트 콘텐츠와 함께 "알람"이라는 제목이 항상 표시됩니다. 또한 알람이 실행될 때 재생되는 사용자 지정 사운드 파일도 지정할 수 있습니다. 사용자가 알람 UI를 탭하면 이 UI를 만든 응용프로그램이 실행되고 초기 응용프로그램 페이지가 표시됩니다.

이 항목에서는 알람 및 미리 알림을 사용하는 응용프로그램을 만드는 전체 과정에 대해 설명합니다. 이러한 두 가지 유형의 예약된 알림을 사용하는 방법은 매우 유사합니다. 이 예제에 나오는 코드 중 극히 일부분만 알람과 미리 알림에 있어 다릅니다. 다음 단계에서는 3가지 응용프로그램 페이지를 구현합니다.

  1. 예약된 알림 목록 페이지 만들기. 이 페이지에는 응용프로그램에서 만들고 등록한 모든 알람과 미리 알림 목록이 표시됩니다. 또한 이 페이지에서는 사용자가 목록에서 알림을 삭제할 수 있습니다.

  2. 예약된 알림 추가 페이지 만들기. 이 페이지는 Silverlight 컨트롤을 사용하여 사용자가 새 알람과 미리 알림을 만들 수 있는 입력 형식을 만듭니다.

  3. 미리 알림 실행 페이지 만들기. 사용자가 미리 알림 대화 상자를 탭한 결과로 실행되는 응용프로그램이 이동할 페이지입니다. 이 페이지에는 쿼리 문자열의 페이지로 전달되는 데이터가 표시됩니다. 이 기능은 미리 알림에만 적용됩니다. 알람은 항상 초기 응용프로그램 페이지를 실행하고 쿼리 문자열 매개 변수는 전달하지 않습니다.

이 예제에서 만드는 첫 페이지는 응용프로그램에 등록된 알람과 미리 알림이 모두 표시되는 페이지입니다. 이 예제는 예약된 알림 목록을 포함하는 IEnumerable 개체에 데이터 바인딩되는 ListBox 컨트롤을 사용합니다. 그러나 편의상 이 예제에서는 전체 MVVM(Model-View-ViewModel) 프레임워크를 구현하지 않습니다. 이 공통 Silverlight 응용프로그램 패턴에 대한 자세한 내용은 Windows Phone 응용프로그램에서 MVVM(Model-View-ViewModel) 패턴 구현을 참조하십시오.

미리 알림 목록 페이지를 만들려면

  1. Visual Studio 에서 새로운 Windows Phone 응용프로그램 프로젝트를 만듭니다. 이 템플릿은 Windows Phone용 Silverlight 카테고리에 있습니다.

  2. 미리 알림 목록 페이지 만들기의 첫 단계는 XAML로 사용자 인터페이스를 만드는 것입니다. 보기 좋은 UI를 만드는 데 필요한 XAML 코드는 방대할 수 있으므로, XAML 코드가 먼저 표시된 다음 중요한 요소가 강조 표시됩니다. Silverlight 컨트롤 사용에 대한 자세한 내용은 Windows Phone용 컨트롤을 참조하십시오.

    다음 코드를 프로젝트의 MainPage.xaml 파일에 붙여 넣습니다. 코드는 "ContentPanel"이라는 Grid 요소 내부에 붙여 넣어야 합니다.

    <TextBlock Text="you have no notifications registered" Name="EmptyTextBlock" Visibility="Collapsed"/>
      <ListBox Name="NotificationListBox">
        <ListBox.ItemTemplate>
        <DataTemplate>
          <Grid Background="Transparent" Margin="0,0,0,30">
            <Grid.ColumnDefinitions>
              <ColumnDefinition Width="380"/>
              <ColumnDefinition Width="50"/>
            </Grid.ColumnDefinitions>
            <Grid Grid.Column="0">
    
              <StackPanel Orientation="Vertical">
                <TextBlock Text="{Binding Title}" TextWrapping="NoWrap" Foreground="{StaticResource PhoneAccentBrush}" FontWeight="Bold"/>
                <TextBlock Text="{Binding Content}" TextWrapping="Wrap" Foreground="{StaticResource PhoneAccentBrush}"/>
    
                <StackPanel Orientation="Horizontal">
                  <TextBlock Text="begin "/>
                  <TextBlock Text="{Binding BeginTime}" HorizontalAlignment="Right"/>
                </StackPanel>
                <StackPanel Orientation="Horizontal">
                  <TextBlock Text="expiration "/>
                  <TextBlock Text="{Binding ExpirationTime}" HorizontalAlignment="Right"/>
                </StackPanel>
                <StackPanel Orientation="Horizontal">
                  <TextBlock Text="recurrence "/>
                  <TextBlock Text="{Binding RecurrenceType}" HorizontalAlignment="Right"/>
                </StackPanel>
                <StackPanel Orientation="Horizontal">
                  <TextBlock Text="is scheduled? "/>
                  <TextBlock Text="{Binding IsScheduled}" HorizontalAlignment="Right"/>
                </StackPanel>
              </StackPanel>
            </Grid>
            <Grid Grid.Column="1">
              <Button Tag="{Binding Name}" Click="deleteButton_Click" Content="X" BorderBrush="Red" Background="Red" Foreground="{StaticResource PhoneBackgroundBrush}" VerticalAlignment="Top" BorderThickness="0" Width="50" Padding="0,0,0,0"></Button>
            </Grid>
          </Grid>
        </DataTemplate>
      </ListBox.ItemTemplate>
    </ListBox>
    
    

    붙여 넣은 코드를 살펴보고 다음 요소에 주목하십시오.

    • 첫 번째 TextBlock 컨트롤은 표시할 예약된 알림이 없는 경우 사용자에게 메시지를 표시하는 데 사용됩니다. C# 코드 숨김 페이지는 목록에 항목이 없는 경우 이 컨트롤의 Visibility 속성을 Visible로 전환하고 목록에 표시할 항목이 있는 경우 Collapsed로 전환합니다.

    • ListBox 요소는 모든 예약된 알림 및 관련 데이터를 나열하는 컨트롤을 정의합니다. 나머지 XAML 코드는 실제로 목록에 항목을 추가하지 않습니다. 대신, 바인딩된 데이터를 표시하는 방법을 ListBox에 알려 주는 DataTemplate을 포함합니다. ListBox 이름인 "NotificationListBox"는 C# 코드 숨김 페이지에서 컨트롤을 참조하는 데 사용되는 이름입니다.

    • GridStackPanel 요소는 다른 컨트롤의 레이아웃을 구성하는 데 사용되는 컨테이너 컨트롤입니다.

    • GridStackPanel 컨트롤의 내부에 있는 TextBlock 요소는 ScheduledNotification 클래스에 속성 값을 표시합니다. 예를 들어 Content 속성은 알람 또는 미리 알림의 텍스트 콘텐츠입니다. RecurrenceType 속성은 미리 알림이 실행될 시간 간격을 알려 줍니다. "{Binding RecurrenceType}" 구문은 이러한 컨트롤 각각의 Text 속성을 지정된 속성 이름에 매핑합니다. 추가 TextBlock 컨트롤은 각 값에 레이블을 제공하기 위해 포함됩니다. Alarm 클래스는 Title 속성을 지원하지 않으므로 이 속성에 바인딩되는 컨트롤은 알람에 대해 비어 있습니다.

    • 마지막으로, 사용자가 예약된 알림을 삭제할 수 있도록 Button이 추가됩니다. 알람 또는 미리 알림의 Name 속성은 각 알림을 고유하게 식별하는 데 사용됩니다. 이 값은 버튼에 대한 Click 이벤트 처리기인 deleteButton_Click이 삭제할 알림을 결정할 수 있도록 ButtonTag 속성에 바인딩됩니다. 이 처리기는 나중에 C# 코드 숨김 페이지에 추가됩니다.

  3. MainPage.xaml을 추가하는 데 필요한 마지막 요소는 ApplicationBar입니다. ApplicationBar에는 새 예약된 알림을 추가하는 데 사용되는 페이지로 이동하기 위해 클릭할 수 있는 ApplicationBarIconButton이 포함됩니다. 주석 처리된 예제 ApplicationBar 코드(프로젝트 템플릿에 포함) 위에 다음 코드를 붙여 넣습니다. 이 코드가 주석 처리되지 않도록 주석도 바꿔야 합니다.

    <phone:PhoneApplicationPage.ApplicationBar>
      <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
       <shell:ApplicationBarIconButton IconUri="/Images/add.png" Text="Add" Click="ApplicationBarAddButton_Click"/>
      </shell:ApplicationBar>
    </phone:PhoneApplicationPage.ApplicationBar>
    
    
  4. 이제 MainPage.xaml.cs에서 코드를 수정할 차례입니다. 먼저 Reminder 클래스가 포함된 네임스페이스를 포함하도록 using 지시문을 추가합니다. 파일의 맨 위에 있는 다른 using 지시문에 다음 줄을 추가합니다.

    using Microsoft.Phone.Scheduler;
    
    
  5. 다음으로 IEnumerable<ScheduledNotification> 형식의 클래스 변수를 추가합니다. 변수 형식에서 "<ScheduledNotification>" 부분은 IEnumerable 개체가 ScheduledNotification 개체를 포함하게 됨을 나타냅니다. 다음과 같이 이 코드를 MainPage 클래스 정의 바로 아래에 추가합니다.

    public partial class MainPage : PhoneApplicationPage
    {
      IEnumerable<ScheduledNotification> notifications;
    
    
  6. ResetItemsList라는 메서드를 만듭니다. 이 메서드는 GetActions<(Of <<'(T>)>>)()()()() 메서드를 사용하여 이 응용프로그램에 대한 ScheduledActionService에 등록된 ScheduledNotification 개체를 검색합니다.

    예약된 알림 목록에 하나 이상의 항목이 있으면 등록된 알림이 없음을 사용자에게 알려 주는 텍스트 블록이 축소되고, 그렇지 않은 경우 표시됩니다. 마지막으로 ListBoxItemsSource 속성은 알림 목록을 포함하는 IEnumerable 클래스 변수로 설정됩니다. 이렇게 하면 ListBox가 자체적으로 업데이트됩니다. 다음 메서드 정의를 MainPage 클래스 정의 내에 붙여 넣습니다.

    private void ResetItemsList()
    {
      // Use GetActions to retrieve all of the scheduled actions
      // stored for this application. The type <Reminder> is specified
      // to retrieve only Reminder objects.
      //reminders = ScheduledActionService.GetActions<Reminder>();
      notifications = ScheduledActionService.GetActions<ScheduledNotification>();
    
      // If there are 1 or more reminders, hide the "no reminders"
      // TextBlock. IF there are zero reminders, show the TextBlock.
      //if (reminders.Count<Reminder>() > 0)
      if (notifications.Count<ScheduledNotification>() > 0)
      {
        EmptyTextBlock.Visibility = Visibility.Collapsed;
      }
      else
      {
        EmptyTextBlock.Visibility = Visibility.Visible;
      }
    
      // Update the ReminderListBox with the list of reminders.
      // A full MVVM implementation can automate this step.
      NotificationListBox.ItemsSource = notifications;
    }
    
    
  7. 페이지 PhoneApplicationPage 기본 클래스의 OnNavigatedTo(NavigationEventArgs) 메서드를 재정의합니다. 이 클래스는 응용프로그램이 시작될 때, 페이지가 처음 표시될 때를 포함하여 사용자가 페이지를 이동할 때마다 호출됩니다. 이 이벤트가 발생할 때마다 방금 정의된 ResetItemsList 메서드가 호출됩니다.

    protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
    {
      //Reset the ReminderListBox items when the page is navigated to.
      ResetItemsList();
    }
    
    
  8. 이제 XAML에서 만든 삭제 버튼에 대한 Click 이벤트 처리기를 구현합니다. 목록에 있는 예약된 알림마다 삭제 버튼이 하나씩 있지만 이러한 모든 버튼은 동일한 처리기를 사용합니다. 삭제할 알림을 결정하기 위해 이 메서드는 Tag 속성을 확인한 다음 ScheduledActionServiceRemove(String) 메서드를 호출합니다. ScheduledNotificationName 속성 및 다른 모든 ScheduledAction 형식은 각 응용프로그램에 대한 개체를 고유하게 식별합니다. 항목이 삭제되고 나면 UI를 업데이트하기 위해 ResetItemsList가 호출됩니다.

    private void deleteButton_Click(object sender, RoutedEventArgs e)
    {
      // The scheduled action name is stored in the Tag property
      // of the delete button for each reminder.
      string name = (string)((Button)sender).Tag;
    
      // Call Remove to unregister the scheduled action with the service.
      ScheduledActionService.Remove(name);
    
      // Reset the ReminderListBox items
      ResetItemsList();
    }
    
    
  9. MainPage.xaml.cs의 마지막 업데이트는 사용자가 새 알람 또는 미리 알림을 추가하기 위해 탭하는 ApplicationBarIconButton에 대한 Click 이벤트 처리기를 만드는 것입니다. Navigate 메서드는 다음 섹션에서 구현될 AddNotification.xaml로 응용프로그램을 안내하는 데 사용됩니다.

    private void ApplicationBarAddButton_Click(object sender, EventArgs e)
    {
      // Navigate to the AddReminder page when the add button is clicked.
      NavigationService.Navigate(new Uri("/AddNotification.xaml", UriKind.RelativeOrAbsolute));
    }
    
    

이 과정의 다음 단계는 사용자가 새 알람 및 미리 알림을 추가할 수 있는 페이지를 만드는 것입니다. 이 페이지에서는 사용자가 새 알람 또는 미리 알림이 실행될 날짜 및 시간을 선택할 수 있어야 합니다. Windows Phone SDK 7.1 은 이 작업을 수행하기 위한 컨트롤을 기본 제공하지 않으며, 컨트롤을 처음부터 만드는 것은 쉽지 않은 일입니다. 따라서 이 예제에서는 Windows Phone용 Silverlight 도구 키트에 포함된 DatePickerTimePicker 컨트롤을 사용합니다. 여기에 나온 코드가 컴파일하기 전에 도구 키트를 설치해야 합니다. 다음 단계는 응용프로그램에서 Toolkit 컨트롤을 사용하는 방법에 대해 설명합니다.

예약된 알림을 추가할 페이지를 만들려면

  1. Windows Phone용 Silverlight 도구 키트를 설치합니다.

  2. 컴퓨터의 시작 메뉴에서 모든 프로그램->Windows Phone용 Silverlight->이진으로 이동합니다. 열리는 Windows 탐색기 창에서 Microsoft.Phone.Controls.Toolkit.dll을 복사하여 응용프로그램 프로젝트 디렉터리에 붙여 넣습니다. Visual Studio 의 프로젝트 메뉴에서 참조 추가…를 선택합니다. 응용프로그램 프로젝트 디렉터리를 찾아 Microsoft.Phone.Controls.Toolkit.dll을 선택하고 확인을 클릭합니다.

  3. 프로젝트에 새 페이지를 추가합니다. 프로젝트 메뉴에서 새 항목 추가…를 선택합니다. Windows Phone 세로 페이지를 선택합니다. 이름 텍스트 상자에 AddNotification.xaml을 입력합니다.

  4. 솔루션 탐색기에서 AddNotification.xaml을 두 번 클릭하여 엽니다. 루트 phone:PhoneApplicationPage 요소의 다른 네임스페이스 선언 옆에 XML 네임스페이스 선언을 추가합니다.

    xmlns:toolkit="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit"
    
    
  5. 다음으로 사용자가 새 알람 미리 알림의 속성을 설정할 수 있는 컨트롤을 추가합니다. 다음 코드를 AddNotification.xaml에 붙여 넣습니다. 코드는 "ContentPanel"이라는 Grid 요소 내부에 붙여 넣어야 합니다.

    
    <ScrollViewer>
      <StackPanel Orientation="Vertical">
        <StackPanel Orientation="Horizontal">
          <RadioButton Content="Reminder" Name="reminderRadioButton" GroupName="ReminderOrAlarm" IsChecked="True"></RadioButton>
          <RadioButton Content="Alarm" Name="alarmRadioButton" GroupName="ReminderOrAlarm" ></RadioButton>
        </StackPanel>
        <TextBlock Height="30" HorizontalAlignment="Left"  Name="titleLabel" Text="title" VerticalAlignment="Top" />
        <TextBox Height="72" HorizontalAlignment="Left"  Name="titleTextBox" Text="" VerticalAlignment="Top" Width="460" MaxLength="63"/>
        <TextBlock Height="30" HorizontalAlignment="Left"  Name="contentLabel" Text="content" VerticalAlignment="Top" />
        <TextBox Height="160" HorizontalAlignment="Left"  Name="contentTextBox" Text="" VerticalAlignment="Top" Width="460" TextWrapping="Wrap" MaxLength="256" AcceptsReturn="True" />
        <TextBlock Height="30" HorizontalAlignment="Left"  Name="beginTimeLabel" Text="begin time" VerticalAlignment="Top" />
        <StackPanel Orientation="Horizontal">
          <toolkit:DatePicker x:Name="beginDatePicker" Width="220" HorizontalAlignment="Left"></toolkit:DatePicker>
          <toolkit:TimePicker x:Name="beginTimePicker"  Width="220" HorizontalAlignment="Right"></toolkit:TimePicker>
        </StackPanel>
        <TextBlock Height="30" HorizontalAlignment="Left"  Name="expirationTimeLabel" Text="expiration time" VerticalAlignment="Top" />
        <StackPanel Orientation="Horizontal">
          <toolkit:DatePicker x:Name="expirationDatePicker" Width="220" HorizontalAlignment="Left"></toolkit:DatePicker>
          <toolkit:TimePicker x:Name="expirationTimePicker" Width="220" HorizontalAlignment="Right"></toolkit:TimePicker>
        </StackPanel>
        <Grid>
          <RadioButton Content="once" Height="72" HorizontalAlignment="Left" Margin="0,0,0,0" Name="onceRadioButton" VerticalAlignment="Top" GroupName="ScheduleInterval" IsChecked="True"/>
          <RadioButton Content="weekly" Height="72" HorizontalAlignment="Left" Margin="0,70,0,0" Name="weeklyRadioButton" VerticalAlignment="Top" GroupName="ScheduleInterval"/>
          <RadioButton Content="daily" Height="72" HorizontalAlignment="Left" Margin="0,140,0,0" Name="dailyRadioButton" VerticalAlignment="Top" GroupName="ScheduleInterval"/>
          <RadioButton Content="monthly" Height="72" HorizontalAlignment="Left" Margin="240,0,0,0" Name="monthlyRadioButton" VerticalAlignment="Top" GroupName="ScheduleInterval"/>
          <RadioButton Content="end of month" Height="72" HorizontalAlignment="Left" Margin="240,70,0,0" Name="endOfMonthRadioButton" VerticalAlignment="Top" GroupName="ScheduleInterval"/>
          <RadioButton Content="yearly" Height="72" HorizontalAlignment="Left" Margin="240,140,0,0" Name="yearlyRadioButton" VerticalAlignment="Top" GroupName="ScheduleInterval"/>
        </Grid>
        <TextBlock Height="30" HorizontalAlignment="Left" Name="param1Label" Text="context parameter 1" VerticalAlignment="Top" />
        <TextBox Height="72" HorizontalAlignment="Left" Name="param1TextBox" Text="" VerticalAlignment="Top" Width="440" MaxLength="63"/>
        <TextBlock Height="30" HorizontalAlignment="Left" Name="param2Label" Text="context parameter 2" VerticalAlignment="Top" />
        <TextBox Height="72" HorizontalAlignment="Left" Name="param2TextBox" Text="" VerticalAlignment="Top" Width="440" MaxLength="63"/>
    
      </StackPanel>
    </ScrollViewer>
    
    
    

    이전 섹션의 XAML 코드는 다음 컨트롤을 포함합니다.

    • 한 쌍의 RadioButton 컨트롤은 사용자가 알람과 미리 알림 간을 전환할 수 있게 합니다.

    • TitleContent 속성에 대한 TextBox 컨트롤입니다. MaxLength 속성은 이러한 컨트롤에 설정되어 속성의 문자 입력 수를 제한합니다. Alarm 클래스는 Title 속성을 지원하지 않으므로 알람을 만들 때 이 값은 사용되지 않습니다.

    • BeginTime 속성에 대한 DatePickerTimePicker 컨트롤입니다. 이들 컨트롤은 함께 알림이 처음 실행될 시간을 지정하며, Windows Phone용 Silverlight 도구 키트에서 가져온 것이므로 미리 정의된 toolkit 네임스페이스를 사용합니다.

    • ExpirationTime 속성에 대한 DatePickerTimePicker 컨트롤입니다. 이 컨트롤은 반복 알림이 더 이상 실행되지 않을 시간을 결정합니다.

    • RecurrenceType 속성을 설정할 RadioButton입니다. 이 컨트롤은 알림 실행 사이의 간격을 결정합니다.

    • 사용자가 NavigationUri 속성에 첨부될 임의 매개 변수 값을 설정할 수 있는 두 개의 텍스트 상자입니다. 미리 알림이 실행되고 사용자가 미리 알림 UI를 탭하면 응용프로그램이 실행되고 제공된 URI로 이동합니다. 이 기능을 사용하면 미리 알림에 컨텍스트 정보를 첨부할 수 있습니다. 이 기능은 알람에는 지원되지 않습니다.

    • TextBlock 컨트롤은 다른 컨트롤의 레이블로 계속 사용됩니다.

  6. 이 코드를 주석 처리된 ApplicationBar 코드 위로 붙여 넣어 ApplicationBar를 XAML에 추가합니다. 이렇게 하면 클릭할 경우 UI의 값에서 새 예약된 알림을 만들고 이를 시스템에 등록할 Save 버튼이 제공됩니다.

    <phone:PhoneApplicationPage.ApplicationBar>
      <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
        <shell:ApplicationBarIconButton IconUri="/Images/save.png" Text="Save" Click="ApplicationBarSaveButton_Click"/>
      </shell:ApplicationBar>
    </phone:PhoneApplicationPage.ApplicationBar>
    
    
  7. 솔루션 탐색기에서 AddNotification.xaml.cs를 두 번 클릭하여 열고 파일의 맨 위에 있는 using 지시문에 Scheduler 네임스페이스에 대한 using 지시문을 추가합니다.

    using Microsoft.Phone.Scheduler;
    
    
  8. 이 페이지에 대한 다른 모든 코드는 Save 버튼의 Click 이벤트 처리기에 배치됩니다. 이 빈 정의를 AddNotification 클래스 정의 내에 붙여 넣습니다.

    private void ApplicationBarSaveButton_Click(object sender, EventArgs e)
    {
      // The code in the following steps goes here.
    }
    
    
  9. 새 알림에 대한 고유한 이름을 생성합니다. 응용프로그램은 알림에 대해 어떠한 명명 규칙도 사용할 수 있지만 각 알림의 이름은 응용프로그램 내에서 고유해야 합니다. 이 예제는 각 미리 알림 이름에 대한 GUID를 생성합니다. 다음 코드를 Save 버튼 Click 처리기 내에 붙여 넣습니다.

      // Generate a unique name for the new notification. You can choose a
      // name that is meaningful for your app, or just use a GUID.
      String name = System.Guid.NewGuid().ToString();
    
    
  10. BeginTime 속성에 대한 날짜 및 시간 값을 결합합니다. 시간이 현재 시간보다 나중인지 확인하고 그렇지 않으면 사용자에게 이를 알리고 Click 처리기를 종료합니다. 그런 다음 ExpirationTime 값에 대해서도 동일한 작업을 수행합니다. 종료 시간은 시작 시간보다 나중이어야 합니다.

      // Get the begin time for the notification by combining the DatePicker
      // value and the TimePicker value.
      DateTime date = (DateTime)beginDatePicker.Value;
      DateTime time = (DateTime)beginTimePicker.Value;
      DateTime beginTime = date + time.TimeOfDay;
    
      // Make sure that the begin time has not already passed.
      if (beginTime < DateTime.Now)
      {
        MessageBox.Show("the begin date must be in the future.");
        return;
      }
    
      // Get the expiration time for the notification.
      date = (DateTime)expirationDatePicker.Value;
      time = (DateTime)expirationTimePicker.Value;
      DateTime expirationTime = date + time.TimeOfDay;
    
      // Make sure that the expiration time is after the begin time.
      if (expirationTime < beginTime)
      {
        MessageBox.Show("expiration time must be after the begin time.");
        return;
      }
    
    
  11. 어떤 라디오 버튼이 선택되어 있는지 확인하여 반복 간격을 알아봅니다. 이 속성의 기본값은 None입니다.

      // Determine which recurrence radio button is checked.
      RecurrenceInterval recurrence = RecurrenceInterval.None;
      if (dailyRadioButton.IsChecked == true)
      {
        recurrence = RecurrenceInterval.Daily;
      }
      else if (weeklyRadioButton.IsChecked == true)
      {
        recurrence = RecurrenceInterval.Weekly;
      }
      else if (monthlyRadioButton.IsChecked == true)
      {
        recurrence = RecurrenceInterval.Monthly;
      }
      else if (endOfMonthRadioButton.IsChecked == true)
      {
        recurrence = RecurrenceInterval.EndOfMonth;
      }
      else if (yearlyRadioButton.IsChecked == true)
      {
        recurrence = RecurrenceInterval.Yearly;
      }
    
    
  12. NavigationUri 속성을 설정할 URI를 작성합니다. URI의 기본은 다음에 만들 ShowParams.xaml로 설정됩니다. 매개 변수 텍스트 상자의 값은 쿼리 문자열 매개 변수로 URI에 추가됩니다. 이 값은 미리 알림이 만들어진 경우에만 사용됩니다.

      // Create a URI for the page that will be launched if the user
      // taps on the reminder. Use query string parameters to pass 
      // content to the page that is launched.
      string param1Value = param1TextBox.Text;
      string param2Value = param2TextBox.Text;
      string queryString = "";
      if (param1Value != "" && param2Value != "")
      {
        queryString = "?param1=" + param1Value + "&param2=" + param2Value;
      }
      else if(param1Value != "" || param2Value != "")
      {
        queryString = (param1Value!=null) ? "?param1="+param1Value : "?param2="+param2Value;
      }
      Uri navigationUri = new Uri("/ShowParams.xaml" + queryString, UriKind.Relative);
    
    
    
  13. 미리 알림의 RadioButton이 선택되어 있는지 확인합니다. 선택되어 있으면 새 미리 알림을 만들고 UI에서 방금 추출한 속성을 설정합니다. ScheduledActionService 클래스의 Add(ScheduledAction) 메서드를 사용하여 새 미리 알림을 시스템에 등록합니다.

      if ((bool)reminderRadioButton.IsChecked)
      {
        Reminder reminder = new Reminder(name);
        reminder.Title = titleTextBox.Text;
        reminder.Content = contentTextBox.Text;
        reminder.BeginTime = beginTime;
        reminder.ExpirationTime = expirationTime;
        reminder.RecurrenceType = recurrence;
        reminder.NavigationUri = navigationUri;
    
        // Register the reminder with the system.
        ScheduledActionService.Add(reminder);
      }
    
    
  14. 미리 알림 RadioButton을 선택하지 않은 경우 알람을 만듭니다. 이렇게 하면 TitleNavigationUri 속성이 지원되지 않는 것을 제외하고 미리 알림을 추가하는 것과 동일한 기능을 합니다. 또한 알람을 사용하면 알람이 호출될 때 재생할 Sound를 지정할 수 있습니다. Visual Studio 에서 프로젝트->기존 항목 추가…를 선택하여 프로젝트에 사운드 파일을 추가합니다. 사운드 파일이 추가된 후에는 Build Action 속성이 Content로 설정되어야 합니다.

      else
      {
        Alarm alarm = new Alarm(name);
        alarm.Content = contentTextBox.Text;
        alarm.Sound = new Uri("/Ringtones/Ring01.wma", UriKind.Relative);
        alarm.BeginTime = beginTime;
        alarm.ExpirationTime = expirationTime;
        alarm.RecurrenceType = recurrence;
    
        ScheduledActionService.Add(alarm);
      }
    
    
  15. 마지막으로 사용자가 미리 알림 목록 페이지로 되돌아가도록 GoBack()()()()을 호출합니다.

      // Navigate back to the main reminder list page.
     NavigationService.GoBack();
    
    

이전 섹션에서 새 알람과 미리 알림을 시스템에 추가하기 위해 페이지를 만들었습니다. 미리 알림이 실행되고 사용자가 미리 알림을 탭하면 NavigationUri 속성에 지정된 페이지가 실행됩니다. 이 예제에서는 URI에 첨부된 쿼리 문자열 매개 변수를 간단히 표시하기 위해 페이지가 만들어집니다.

예약 실행 페이지를 만들려면

  1. 프로젝트에 새 페이지를 추가합니다. 프로젝트 메뉴에서 새 항목 추가…를 선택합니다. Windows Phone 세로 페이지를 선택합니다. 이름 상자에 ShowParams.xaml을 입력합니다.

  2. 쿼리 문자열 매개 변수를 표시하는 데 사용될 ShowParams.xaml에 TextBlock 컨트롤을 추가합니다. 코드는 "ContentPanel"이라는 Grid 요소 내부에 붙여 넣어야 합니다.

    <TextBlock Height="30" HorizontalAlignment="Left" Margin="12,10,0,0" Name="param1Label" Text="param1 value:" VerticalAlignment="Top" Foreground="{StaticResource PhoneForegroundBrush}" />
    <TextBlock Height="30" HorizontalAlignment="Left" Margin="12,40,0,0" Name="param1TextBlock" Text="TextBlock" VerticalAlignment="Top" Foreground="{StaticResource PhoneAccentBrush}"/>
    <TextBlock Height="30" HorizontalAlignment="Left" Margin="12,80,0,0" Name="param2Label" Text="param2 value:" VerticalAlignment="Top" Foreground="{StaticResource PhoneForegroundBrush}"/>
    <TextBlock Height="30" HorizontalAlignment="Left" Margin="12,110,0,0" Name="param2TextBlock" Text="TextBlock" VerticalAlignment="Top" Foreground="{StaticResource PhoneAccentBrush}" />
    
    
    
  3. PhoneApplicationPage 기본 클래스의 OnNavigatedTo(NavigationEventArgs) 메서드를 재정의합니다. 이 메서드는 응용프로그램이 미리 알림에서 실행될 때 호출되어 이 페이지로 이동하게 합니다. 이 메서드에서는 NavigationContext 클래스를 사용하여 쿼리 문자열 값을 가져오고 TextBlock 개체의 Text 속성을 설정하여 값을 표시합니다.

    // Implement the OnNavigatedTo method and use NavigationContext.QueryString
    // to get the parameter values passed by the reminder.
    protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
    {
      base.OnNavigatedTo(e);
    
      string param1Value = "" ;
      string param2Value = "";
    
      NavigationContext.QueryString.TryGetValue("param1", out param1Value);
      NavigationContext.QueryString.TryGetValue("param2", out param2Value);
    
      param1TextBlock.Text = param1Value;
      param2TextBlock.Text = param2Value;
    }
    
    

표시:
© 2014 Microsoft