データ テンプレートは、XAML での項目のレンダリングを合理化しますが、内部コントロールへのアクセスは、視覚的および論理的なツリーの分離により課題が生じます。 複数のテンプレート インスタンス間で名前が競合する可能性があるため、Name
プロパティは FlipView
の DataTemplate
内で直接使用できません。
解決策は、VisualTreeHelper
を使用してビジュアル ツリーを横断し、生成された各項目内の特定のコントロールを見つけることです。
ヘルパー関数:
この関数は、指定された名前のコントロールをビジュアル ツリーで再帰的に検索します。
<code class="language-csharp">public T FindChildControl<T>(DependencyObject control, string ctrlName) where T : DependencyObject { int childNumber = VisualTreeHelper.GetChildrenCount(control); for (int i = 0; i < childNumber; i++) { DependencyObject child = VisualTreeHelper.GetChild(control, i); FrameworkElement fe = child as FrameworkElement; if (fe != null && fe.Name == ctrlName) { return child as T; } else { T nextLevel = FindChildControl<T>(child, ctrlName); if (nextLevel != null) return nextLevel; } } return null; }</code>
コントロールへのアクセス:
現在選択されている Image
項目からコントロール (例: "img1" という名前の FlipView
) を取得するには、次のコードを使用します:
<code class="language-csharp">var selectedItem = MyFlipView.SelectedItem; if (selectedItem == null) return null; var container = MyFlipView.ItemContainerGenerator.ContainerFromItem(selectedItem); Image img1 = FindChildControl<Image>(container, "img1");</code>
これにより、Image
コントロールが取得されます。 コントロールが見つからない場合は、忘れずに null
ケースを処理してください。
以上がFlipView で XAML DataTemplate 内のコントロールにアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。