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
への参照が含まれていることがわかります。もちろんこれはコードにアクセスできません。
私は、それぞれの子StackPanel
にMouseLeftButtonDown
ハンドラを追加し、最後に選択されたものを保存し、その後ContextMenu
ハンドラ内でこれを取得することによってこの問題を解決することができますが、この解決策は少し醜い感じています。これを行うより良い方法はありますか?
ご協力いただきありがとうございます。
私はデバッガのウォッチウィンドウであることを試してみましたが、UIElementのは持っていないというエラーを得た:代わりのDependencyObject(可能であれば)としてキャストし、ビジュアルツリーを歩いてそれを使用
Nameプロパティ – Praetorian
@Praetorian申し訳ありませんが、 'Name'は単なる例であり、オブジェクトの名前を指定した場合のみ関連します。他の選択肢との回答も拡大しました。 –
これはうまくいくようです(編集に入力ミスがあり、クラス名は 'VisualTreeHelper'でなければなりません)。私はそれに追加の欠陥があったので私の元のアプローチを放棄した、あなたは複数の親に同じコンテキストメニューオブジェクトを添付することはできません。だから、私はすぐにコンテキストメニューを作っています。 – Praetorian