FlipViewの一つ一のアイテムの表示したいときがあります。
データバィンディングを用いて中身のデータを変えるようなケースだとバインド対象のデータを変更すればよいのですが、特定のページだけTextBlockにUIContainerを追加したい場合などにはアイテムのテンプレートを取得して操作したくなります。
このような場合に特定のテンプレートを取得したい場合は以下のコードで取得できます。
// FlipViewコントロールから現在表示中のItemを取得する
var flipViewItem = this.flipView.ItemContainerGenerator.ContainerFromIndex(this.flipView.SelectedIndex);
(ただしSelectionChangedイベントの一回目では取得できなかったりと、上記コードでnullが返るケースがあったので注意。コントロールのバグだと思うんだけど・・・)
FlipViewItemが取得できたら、ほしい要素をツリーから取得します。
ツリーからの取得はWindows Phoneでもお世話になったFindFirstElementInVisualTreeメソッドが利用できます。
FindFirstElementInVisualTreeメソッドのコードは以下、
private T FindFirstElementInVisualTree<T>(DependencyObject parentElement) where T : DependencyObject { var count = VisualTreeHelper.GetChildrenCount(parentElement); if (count == 0) return null; for (int i = 0; i < count; i++) { var child = VisualTreeHelper.GetChild(parentElement, i); if (child != null && child is T) { return (T)child; } else { var result = FindFirstElementInVisualTree<T>(child); if (result != null) return result; } } return null; }
FindFirstElementInVisualTreeを以下のような感じで使います。下はRitchTextBlockを取得する場合。
RichTextBlock tmp_ritchTextBlock = FindFirstElementInVisualTree<RichTextBlock>(flipViewItem);
参考:How to access a Control placed inside ListBox ItemTemplate in WP7
Please give us your valuable comment