方法: Windows Phone のカレンダー データにアクセスする

2012/02/09

カレンダーのデータにアクセスする手順では、Appointments オブジェクトへの参照を取得し、非同期の検索を実行し、その結果を Appointment オブジェクトのコレクションとしてキャプチャします。結果はさまざまに使用できます。このトピックでは、結果をユーザー インターフェイスにバインドしたり、結果を列挙したりする方法を示します。

注注:

Windows Phone SDK 7.1 では、ユーザーの複数のアカウント全体で集約されたユーザーのカレンダー データに読み取り専用でアクセスできます。詳細については、「Windows Phone の連絡先とカレンダー」を参照してください。

このトピックは、次のセクションで構成されています。

この手順では、テストの目的でのみボタン クリック イベントにコードを配置します。作成したアプリケーションでは、必要に応じてカレンダーのデータにアクセスできます。次の手順では、ButtonAppointments という名前のボタンを持つ Windows Phone アプリケーションがあることを前提としています。この手順では、次の 7 日間の予定をすべて検索します。

重要な注重要な注:

Windows Phone Emulator にはサンプルの予定が含まれていません。物理デバイスを使用して、これらの手順をテストする必要があります。

カレンダー データへのアクセス方法

  1. ページの分離コード ファイルの先頭に、次のステートメントを追加します。

    using Microsoft.Phone.UserData;
    
  2. 次のコードを追加します。ボタン クリック イベントと、非同期検索の完了したイベントを処理するためのメソッドが含まれています。

    private void ButtonAppointments_Click(object sender, RoutedEventArgs e)
    {
        Appointments appts = new Appointments();
    
        //Identify the method that runs after the asynchronous search completes.
        appts.SearchCompleted += new EventHandler<AppointmentsSearchEventArgs>(Appointments_SearchCompleted);
    
        DateTime start = DateTime.Now;
        DateTime end = start.AddDays(7);
        int max = 20;
    
        //Start the asynchronous search.
        appts.SearchAsync(start, end, max, "Appointments Test #1");
    }
    
    void Appointments_SearchCompleted(object sender, AppointmentsSearchEventArgs e)
    {
        //Do something with the results.
        MessageBox.Show(e.Results.Count().ToString());
    }
    

この手順では、予定を検索した結果をユーザー インターフェイスに直接データ バインディングします。この手順は、前のセクションで "カレンダー データへのアクセス" の手順を完了していることを前提としています。

予定データのデータ バインディング方法

  1. ページの XAML エディターを開き、次のコードを追加します。コードをコンテンツ パネルまたはレイアウト ルート GRID 要素に追加できます。この XAML は予定データにバインドするリスト ボックスを作成します。リスト ボックスの各行のデータ テンプレートには、予定の件名が含まれています。アプリケーション内で、希望するデータ テンプレートを作成できます。詳細については、「データ バインディングの概要」および「データ テンプレートの概要 」を参照してください。

    <StackPanel Height="Auto" Width="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
    
        <TextBlock Name="AppointmentResultsLabel" Text="results are loading..." Style="{StaticResource PhoneTextLargeStyle}" TextWrapping="Wrap" />
    
        <ListBox Name="AppointmentResultsData" ItemsSource="{Binding}" Height="200" Margin="24,0,0,0" >
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Path=Subject, Mode=OneWay}" />
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </StackPanel>
    
  2. ページの分離コードで、既存のイベント ハンドラーを次のコードに置き換えます。このコードは、リスト ボックスのデータ コンテキストを検索の結果と同じに設定して、予定データをユーザー インターフェイスにバインドします。結果がない場合のエラー処理を含みます。さらに、コードは結果があるかどうかによって、リスト ボックス ラベルのテキストも変更します。

    void Appointments_SearchCompleted(object sender, AppointmentsSearchEventArgs e)
    {
        try
        {
            //Bind the results to the user interface.
            AppointmentResultsData.DataContext = e.Results;
        }
        catch (System.Exception)
        {
            //No results
        }
    
        if (AppointmentResultsData.Items.Any())
        {
            AppointmentResultsLabel.Text = "results";
        }
        else
        {
            AppointmentResultsLabel.Text = "no results";
        }
    }
    
  3. ソリューションを保存してビルドします。

  4. アプリケーションを起動し、ボタンをクリックします。

    データがリスト ボックスに表示されます。

この手順では、予定の検索結果を取得し、メッセージ ボックスで結果を表示します。この手順は、このトピック内の前のセクションで "カレンダー データへのアクセス" の手順を完了していることを前提としています。

予定データを取得する方法

  1. ページの分離コードで、既存のイベント ハンドラーを次のコードに置き換えます。このコードは、for-each ループを使用して予定データを取得します。

    void Appointments_SearchCompleted(object sender, AppointmentsSearchEventArgs e)
    {
        System.Text.StringBuilder sb = new System.Text.StringBuilder();
    
        foreach (Appointment appt in e.Results)
        {
            sb.AppendLine(appt.Subject);
        }
    
        MessageBox.Show(sb.ToString());
    }
    
  2. ソリューションを保存してビルドします。

  3. アプリケーションを起動し、ボタンをクリックします。

    メッセージ ボックスが表示されます。

この手順では、LINQ を使用して予定の検索結果を絞り込みます。結果をユーザー インターフェイスに直接データバインドします。この手順は、このトピック内の前のセクションで "予定データへのアクセス" の手順を完了していることを前提としています。

LINQ を使用するには

  1. ページの分離コードで、既存のイベント ハンドラーを次のコードに置き換えます。このコードは、終日ではない予定の結果をクエリします。

    void Appointments_SearchCompleted(object sender, AppointmentsSearchEventArgs e)
    {
        try
        {
            AppointmentResultsDataLINQ.DataContext =
                from Appointment appt in e.Results
                where appt.IsAllDayEvent == false
                select appt;
    
        }
        catch (System.Exception)
        {
            //No results
        }
    }
    
  2. ページの XAML エディターを開き、次のコードを追加します。コードをコンテンツ パネルまたはレイアウト ルート GRID 要素に追加できます。この XAML は予定データにバインドするリスト ボックスを作成します。リスト ボックスの各行には、予定の件名が含まれます。

    <ListBox Name="AppointmentResultsDataLINQ" ItemsSource="{Binding}" Height="200" Margin="24,0,0,0" >
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock Text="{Binding Path=Subject, Mode=OneWay}" />
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    
  3. ソリューションを保存してビルドします。

  4. アプリケーションを起動し、ボタンをクリックします。

    フィルター処理されたデータがリスト ボックスに表示されます。

表示: