1

パノラマ内にパノラマコントロールとリストボックスコントロールがあります。Panorama や ListBox コントロールに関連付けられたすべてのデータ バインディングまたは UI 表示が終了したときに、フックできる「イベント」または検出する方法はありますか?

このイベントを検出する必要があるのは、Panorama コントロールや ListBox コントロールが完全にバインドされ、レンダリングが終了した後にのみ ApplicationBar を表示したいからです。

たとえば、私の XAML は次のように定義されています。

<controls:Panorama Name="panorama">
 <controls:Panorama.ItemTemplate>
  <DataTemplate>
   <ListBox ItemsSource="{Binding Details}">
    <ListBox.ItemTemplate>
     <DataTemplate>
      <TextBlock Text="{Binding Field1}"/>
      <TextBlock Text="{Binding Field2}"/>
      ...
      <TextBlock Text="{Binding FieldN}"/>
     </DataTemplate>
    </ListBox.ItemTemplate>
   </ListBox>
  </DataTemplate>
 </controls:Panorama.ItemTemplate>
</controls:Panorama>

私の昔ながらの CLR オブジェクト (POCO) は次のようになります。

public class MyPoco {
 List<Detail> Details { get; set; }
}
public class Detail {
 public string Field1 { get; set; }
 public string Field1 { get; set; }
 ...
 public string FieldN { get; set; }
}

私のC#コードビハインドでは、次のようにデータをバインドします。

List<MyPoco> pocos = GetMyPocosFromSomewhere();   
panorama.ItemsSource = myList;
ApplicationBar.IsVisible = true; //i only want to make this visible after the Panorama and ListBox controls have finished binding and rendering

現在、上でスケッチしたコードは機能しますが、ApplicationBar は、Panorama/ListBox コントロールがレンダリングされる前に常に表示されます。私にとって、これはユーザーエクスペリエンスをぎこちなくします。

どんな助けでも大歓迎です。

4

1 に答える 1

4

簡単な答えは「いいえ、あなたはそれを検出することはできません」です。

しかし、良い解決策は、コマンドをUIワークキュー(別名)に追加することです。ディスパッチャー。このような:

Dispatcher.BeginInvoke(() => ApplicationBar.IsVisible = true);

そうすれば、他のすべてのUIタスクが完了したときに、最初にレンダリングされます。エクスペリエンスはそれほど厄介なものではありません。

于 2011-10-05T19:33:08.493 に答える