6

私の WPF プロジェクトには、少し複雑なコントロールがあります。このプロジェクトでは、MainWindow 以外にコントロールのみを使用します (それらはすべてテンプレート化されています)。

1 つの画面に次のレイアウトがあります (テンプレートが適用され、コンテンツが入力された後のレイアウトを表示するため)。

MyScreenControl
-MyTableControl
--ItemsControl
--- HeaderItemsControl
-----HeaderItemsControl.Header
------MyHeaderControl
-----HeaderItemsControl.Items
------MyItemControl
------MyItemControl
--- ---MyItemControl
...

ScreenControl のコード ファイルにいるとき、OnMouseLeftButtonDown メソッドで、クリック イベントが MyHeaderControl または MyItemControl から来たかどうかを判断したいと思います。

MouseButtonEventArgs の Source は ScreenControl であり、 OriginalSource は MyItemControl/MyHeaderControl のテンプレートの TextBlock です。

MyItemControl/MyHeaderControl を見つける最初の試みは、OriginalSource から開始し、Parent プロパティの型を再帰的に調べることでした。Template のルート (この場合は ViewBox) に到達するまで問題なく動作しますが、ルートには Parent 要素がありません。

私は私の以前のプロジェクトでこのような方法を使用しましたが、それは機能しましたが、その後、コントロールやテンプレートではなく、ユーザーコントロールを使用していました。

この問題にどのようにアプローチすればよいでしょうか (良いアイデアはコードと同様に歓迎されます)。

thx、テンシコ

4

2 に答える 2

7

originalSource の templatedParent を取得しようとしましたか? :

Control originalSource = e.OriginalSource;

MyItemControl myItemControl = originalSource.TemplatedParent as MyItemControl;
MyHeaderControl myHeaderControl = originalSource.TemplatedParent as MyHeaderControl;

if (MyItemControl != null) ....
else if (MyHeaderControl != null) ....

(参照: http://msdn.microsoft.com/en-gb/library/system.windows.frameworkelement.templatedparent.aspx )

于 2010-12-02T16:14:24.717 に答える
3

VisualTreeHelper.GetParentを確認してください。これにより、コントロールがテンプレートを通じて実際にインスタンス化されたビジュアル ツリーをたどることができます。

于 2010-12-02T15:48:34.093 に答える