2010-12-30 6 views
1

XMLファイルを読んで、私のアプリケーションにStackPanelの内容を動的に取り込んでいます。 StackPanelの各子は、別のUIElementオブジェクトを含む別のStackPanelです。 StackPanelネストされた理由は、これら3つの異なるContextMenuのうちの1つをこれらの子のStackPanelに関連付けるためです。WP7 ContextMenuの所有者を探す

ので、構造は次のようになります。

var stackPanels = parentStackPanel.Children.OfType<StackPanel>(); 

for(int i = 0; i < stackPanels.Count(); ++i) { 
    if(someCondition) { 
    ContextMenuService.SetContextMenu(stackPanels.ElementAt(i), MyContextMenu1); 

    } else if(someOtherCondition) { 
    ContextMenuService.SetContextMenu(stackPanels.ElementAt(i), MyContextMenu2); 

    } else { 
    ContextMenuService.SetContextMenu(stackPanels.ElementAt(i), MyContextMenu3); 

    } 
} 

すべてMenuItemのすべての3の下:私は3つのContextMenuの中から選択し、それらを次のように取り付けていた各StackPanel子のために

---- StackPanel parent 
     | 
     ---- StackPanel child 
     | | 
     | ---- TextBlock 
     | 
     ---- StackPanel child 
     | | 
     | ---- TextBox 
     | 
     ---- StackPanel child 
     | | 
     | ---- Image 
     | 
     . 
     . 
     . 

ContextMenuには同じClickハンドラがあります。

最後に、質問:どのようにStackPanel子供のContextMenuが呼び出されてクリックされたかを特定するにはどうすればよいですか?デバッガのクリックハンドラ内の送信側オブジェクトを調べると、という名前のOwnerがあり、StackPanelへの参照が含まれていることがわかります。もちろんこれはコードにアクセスできません。

私は、それぞれの子StackPanelMouseLeftButtonDownハンドラを追加し、最後に選択されたものを保存し、その後ContextMenuハンドラ内でこれを取得することによってこの問題を解決することができますが、この解決策は少し醜い感じています。これを行うより良い方法はありますか?

ご協力いただきありがとうございます。

答えて

1

senderをクリックイベントハンドラにUIElementとしてキャストすると、クリックされた実際のアイテムを特定するために必要なものを得ることができます。

VisualTreeHelper.GetParent((sender as DependencyObject)) 
+0

私はデバッガのウォッチウィンドウであることを試してみましたが、UIElementのは持っていないというエラーを得た:代わりのDependencyObject(可能であれば)としてキャストし、ビジュアルツリーを歩いてそれを使用

(sender as UIElement).Property 

Nameプロパティ – Praetorian

+0

@Praetorian申し訳ありませんが、 'Name'は単なる例であり、オブジェクトの名前を指定した場合のみ関連します。他の選択肢との回答も拡大しました。 –

+0

これはうまくいくようです(編集に入力ミスがあり、クラス名は 'VisualTreeHelper'でなければなりません)。私はそれに追加の欠陥があったので私の元のアプローチを放棄した、あなたは複数の親に同じコンテキストメニューオブジェクトを添付することはできません。だから、私はすぐにコンテキストメニューを作っています。 – Praetorian

関連する問題