WPF とSilverlightで特定の型の親コントロールを検索する
これは画期的な、心を揺さぶる秘密のトリックではないことを私は知っていますが、私はコントロールの特定のタイプの親を見つける方法について驚くほど多くの質問を受けています。
型に基づいて親コントロールを見つける機能は、Prismアプリケーションのようにビューを動的に構成するときに非常に便利です。 これが役立つシナリオは他にもたくさんありますが、これに対する最新の要求は、私のXamDockManager Prism Region Adapterの投稿に基づいていました。 誰かが、ContentPaneを閉じることができるかどうかを制御するために、ContentPaneに挿入されるビューにアタッチされる動作を作成したいと考えていました。 キャンセル可能な Closing イベントは、挿入された View ではなく ContentPane コントロール自体に存在するため、ビヘイビア内から ContentPane 型の親にアクセスする必要がありました。 まあ、彼らにとって幸運なことに、これは本当に簡単に行うことができます。
public static T FindParent<T>(DependencyObject child) where T : DependencyObject
{
//get parent item
DependencyObject parentObject = VisualTreeHelper.GetParent(child);
//we've reached the end of the tree
if (parentObject == null) return null;
//check if the parent matches the type we're looking for
T parent = parentObject as T;
if (parent != null)
return parent;
else
return FindParent<T>(parentObject);
}
この単純なコード スニペットは、指定された特定の種類に一致する親コントロールを探して、コントロールのビジュアル ツリーを走査します。 これを使用するには、FindParent<T> メソッド (T は探している型) を呼び出し、親にするコントロールを渡すだけです。
ContentPane _parentContentPane = FindParent<ContentPane>(this);
if (_parentContentPane != null)
_parentContentPane.Closing += _parentContentPane_Closing;
この例では、ユーザー コントロールのビジュアル ツリーを検索し、ユーザー コントロール インスタンスを含むxamDockManager ContentPane を探します。 ああ、そして、この正確なコードスニペットはWPFとSilverlightの両方で同じように機能することを言いましたか? それは簡単でした!
私のブログでお気軽に私に連絡するか、Twitter(@brianlagunas)で私とつながるか、質問やコメントのために下にコメントを残してください。