5

私はWindows Phone 8アプリに取り組んでいます。私のアプリは、Tokit の ListPicker を使用しています。問題の私のコードは次のようになります。

<toolkit:ListPicker x:Name="myListPicker" Margin="12,-6,12,-2" Loaded="myListPicker_Loaded">
  <toolkit:ListPicker.Items>
    <!-- Items are defined here -->
  </toolkit:ListPicker.Items>
</toolkit:ListPicker>


private void myListPicker_Loaded(object sender, RoutedEventArgs e)
{
  if ((myListPicker != null) && (viewModel != null))
  {

  }
}

項目の総数が特定のしきい値を超えるたびに、私のアプリは System.ArgumentException をスローします。私は次のコードを持っているので、これを知っています:

    private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
    {
        MessageBox.Show(e.ExceptionObject.Message + "\n\nException\n" + e.ExceptionObject.GetType().FullName + "\n" + e.ExceptionObject.StackTrace);
        if (Debugger.IsAttached)
        {
            // An unhandled exception has occurred; break into the debugger
            Debugger.Break();
        }
    }

「値が期待される範囲内にありません」というメッセージが表示されます。私が知る限り、これは ListPicker を全画面モードにする必要があるときに発生します。なぜこれが起こるのかわかりません。

誰にも洞察がありますか?

4

3 に答える 3

5

一見、全画面表示モードでは、ListPicker の項目を xaml ページ内の特定の UI 要素に設定することはできません。それらをバインドするか、テンプレートを使用する必要があります。

この正確な問題が発生した後、ここで説明を見つけました: http://silverlight.codeplex.com/workitem/9412

ListPickerItems は UIElements であり、ListPicker はそれらをプレゼンターでレンダリングします。項目が 5 つ以下の場合、現在のページで拡張モードが開き、発表者にすべての項目が表示されます。6 つ以上のアイテムが存在する場合、リスト ピッカーを開くとフル モードになり、新しいページが開きます。この新しいページにはリストボックスがあり、リストピッカーの項目に設定された項目プロパティを取得します。これが壊れるところです。リストボックスの項目をリストピッカーの項目 (この場合は listpickeritem のリスト) に設定することで、リストボックスはそれらの UIElements をそのビューに配置します。現在、1 つのリストボックス項目がビジュアル ツリーの 2 つの場所に含まれています。

この問題のため、ListPicker はデータバインディングとテンプレート化のみをサポートしています。ListPicker の項目を特定の UIElements に設定しないでください

次のような方法でソリューションを機能させることができました。

<toolkit:ListPicker x:Name="myListPicker" Margin="12,-6,12,-2" Loaded="myListPicker_Loaded">
  <toolkit:ListPicker.ItemTemplate>
      <DataTemplate>
          <TextBlock Text="{Binding Name}" Tag="{Binding ID}"/>
      </DataTemplate>
   </toolkit:ListPicker.ItemTemplate>
   <toolkit:ListPicker.FullModeItemTemplate>
      <DataTemplate>
          <TextBlock Text="{Binding Name}" Tag="{Binding ID}"/>
      </DataTemplate>
   </toolkit:ListPicker.FullModeItemTemplate>
</toolkit:ListPicker>


private void myListPicker_Loaded(object sender, RoutedEventArgs e)
{
  if ((myListPicker != null) && (viewModel != null))
  {
     myListPicker.ItemsSource = _Data; //_data is an array of objects with 2 properties named ID & Name
  }
}
于 2013-06-18T13:57:20.040 に答える
0

ListPicker には、標準リストに表示できる事前定義された数の要素があります。ツールキットの古いバージョンでは、このしきい値を変更できましたが、その後削除されました。

ただし、ツールキットはオープン ソースであるため、私が行ったことをいつでも行うことができます。ソース コードを調べて、より大きなリストを許可するように変更してください。

于 2013-06-12T14:23:18.877 に答える