2011-01-27 5 views
2

でユーザーコントロールの親を取得するために、私は時々、メインパネル(キャンバス)にユーザーコントロールを追加する必要があります。そのユーザーコントロールは、クリックされたとき、MainPage.xamlをからルーチンにアクセスする必要がある - それは親の親だ - ユーザーコントロール自体Visibility = Collapsedをしたり、MainPage.xamlをから一斉に削除するかいます。私はこれが機能しているが、それはこれを行うには、よりストレートフォワードな方法以上の好適な方法があるなら、私は思ってしまうAより良い方法は、私のMainPage.xamlをオンシルバー

Dim c = VisualTreeHelper.GetParent(Me) 
Dim mp As MainPage = VisualTreeHelper.GetParent(c) 
mp.MyRoutine(3) 

をやっていること、ユーザーコントロールの背後にあるコードで今

。何か案は?

答えて

5

より一般的な方法は、あなたがあなたのビジュアルツリー上のクエリのすべての種類を行うことができ、この小さな枠組みで、Linq To VisualTree経由で入手可能です。親はのように簡単になり得ることのあなたの例:あなたが与えられたタイプの最初の親を検索したい場合は

var parent = me.Ancestors().First(); 

それとも、...

var parent = me.Ancestors<MainPage>().Cast<MainPage>().First() 
+0

うわー、私はこのことを知らなかった存在していました。確かめます。 – Stan

+1

@ColinE:それは 'me.Ancestorsすべきではない()(1)1次回を()スキップ;'。?彼はビジュアルツリーの2つのレベルに上がっています... –

+0

+1 ...良い点。更新された答え。 – ColinE

4

は一般的に、私は、依存関係のこのタイプを避けるだろう。これにより、UserControlの有用性と柔軟性が大幅に低下します。

代わりに、建設(あるいは実行時)の間に、ユーザーコントロールへの依存関係をプッシュする方がよいかもしれません。 MyRoutineを参照する代理人、またはメインページが実装するインターフェイスを渡すことができます。

この方法では、(それはAPIの一部だから)UserControlの依存性は明らかであろう、そして後に他のアプリケーション/ページでそれを使用することも可能です。あなたは上記を維持することを決定した場合には言われて、私は最低でも1つの変更を加えるだろうと

。あなたのクラスのメソッドにメインウィンドウ(または何も)に到達するまでだけではなく、親の親は常に「メインウィンドウ」であることを期待し、私は再帰的に親をチェックします。これは、少なくとも、それを破ることなく、階層内でUserControlを移動する柔軟性を可能にします。ビジュアルツリーをナビゲートする

+0

これは面白い、インターフェイスのアイデアです。私は過去にインターフェースを多用していませんでしたが、検討する価値があります。 – Stan

+0

@Stan:これははるかに "再利用可能な"コントロールになります。今、ユーザーコントロールは非常にあなたのメイン・ウィンドウクラスに結びついている、と階層内の特定のポイントでのみ使用可能な... –

2

私は視覚的にナビゲートする一般的な方法ツリーは私自身のVisualTreeEnumerationコードです。しかし、私がブログに書いているように、同じことをするためのさまざまなユーティリティがあります。あなたが何を使っていても、数え切れないほどの祖先が生まれます。しかし、ほとんどの最もflexiableアプローチはMainPageタイプのために狩りに次のようになります -

(注C#の)

MainPage mp = this.Ancestors().OfType<MainPage>().FirstOrDefault(); 

これはVBどのように見えるかわかりません。

関連する問題