2010-12-02 10 views
4

私のWPFプロジェクトでは、少し複雑なコントロールがあります。このプロジェクトでは、MainWindowのほかにControls(すべてテンプレート化されています)を使用します。 (テンプレートが適用されて、内容物を充填された後のレイアウトを示す)私は、次のレイアウトを有する1つの画面でテンプレートコントロールの親をタイプ(!)(wpf)で見つけることができません

MyScreenControl
-MyTableControl
--ItemsControl
--- HeaderItemsControl
- ---- HeaderItemsControl.Header
------ MyHeaderControl
----- HeaderItemsControl.Items
------ MyItemControl
------ MyItemC ontrol
------クリックイベントがMyHeaderControlまたはMyItemControlから来た場合、私は決定したいOnMouseLeftButtonDown方法でMyItemControl
...

私はScreenControlのコードファイルによ、 。

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

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

これまでの私の以前のプロジェクトでは、このようなメソッドを使用していましたが、その後はコントロールやテンプレートではなくUserControlsで作業していました。

どのように私はこの問題にアプローチする必要があります(良いアイデアはコードとしても歓迎です)?できるようになる

THX、 Tenshiko

+0

を時々子供がロードされていないまで、親を探すために役立つことができます。たとえば、yourChild.Loadedイベント – peter70

答えて

4

元のソースの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

+0

OMGそれです!どうも! – Tenshiko

+0

あなたは大歓迎です:)(私は熱意を感じました) – David

2

チェックアウトVisualTreeHelper.GetParentは、あなたがコントロールが実際にテンプレートによってインスタンス化されたビジュアルツリーを歩きます。

+0

を使用しても同じことができます。 GetParent()によると、私のコントロールは次のようになります: – Tenshiko

+0

グリッドグリッドテキストブロックの代わりにグリッドグリッドテキストブロック – Tenshiko

関連する問題