3

タイトルがすべてを物語っています。私はたくさんのボタンを持っていますが、それらはすべて同じコンテキスト メニューを持っています。クリック イベントから、どのボタンがクリックされてそこに到達したかを判断したいと考えています。

このコードは機能しません。placementTarget は null です:

private void mi_Click(object sender, RoutedEventArgs e)
{
        Button contextMenuEzen = null;

        MenuItem mnu = sender as MenuItem;

        if (mnu != null)
        {
            ContextMenu ize =(ContextMenu)mnu.Parent;
            contextMenuEzen = ize.PlacementTarget as Button;
        }
}

私を助けてください!

4

3 に答える 3

1

RoutedEvents は、通常のイベントとまったく同じようには機能しません。ハンドラーのシグネチャは EventHandler(object sender, RoutedEventArgs e) です。RoutedEventArgs には、実際にクリックされた UI の要素を表す OriginalSource というプロパティがあります。対照的に、sender パラメーターは常に、イベント ハンドラーが登録されているオブジェクトになります。

于 2013-08-15T19:59:53.100 に答える
0

次の例のように、 ContextMenuServiceを使用して配置ターゲットを取得します。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        Loaded += (sender, args) => {

            RoutedEventHandler clickHandler = delegate(object o, RoutedEventArgs eventArgs) {
                var mi = (MenuItem) o;
                var contextMenu = (ContextMenu) mi.Parent;

                var pTarget = ContextMenuService.GetPlacementTarget(contextMenu) as Button;

                // just to make sure
                if (pTarget == null) {
                    return;
                }

                string message = "You clicked on the button " + pTarget.Content;
                MessageBox.Show(message);
            };

            // create a single instance of the ContextMenu
            var cm = new ContextMenu();
            for (int i = 0; i < 10; i++) {
                var mi = new MenuItem {Header = "Item " + i};
                mi.Click += clickHandler;
                cm.Items.Add(mi);
            }

            // create a set of buttons and assign them to the RootVisual(StackPanel)
            for (int i = 0; i < 5; i++) {
                var button = new Button {Content = "Button " + i, ContextMenu = cm};
                this.RootVisual.Children.Add(button);
            }
        };
    }
}
于 2013-08-18T21:55:06.017 に答える