获取按钮上上下文菜单的所有者



标题几乎说明了一切。我有很多按钮,它们都有相同的上下文菜单,我想从点击事件中确定哪个按钮是正确点击的。

此代码不起作用,placementTarget为空:

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;
        }
}

请帮帮我!

对我来说,这个例子很有效:

XAML

<Window.Resources>
    <!-- For all MenuItems set the handler -->
    <Style TargetType="{x:Type MenuItem}">
        <EventSetter Event="Click" Handler="MenuItem_Click" />
    </Style>
    <!-- One ContextMenu for all buttons (resource) -->
    <ContextMenu x:Key="MyContextMenu">
        <MenuItem Header="Click this" />
        <MenuItem Header="Two" />
        <MenuItem Header="Three" />
    </ContextMenu>
</Window.Resources>
<Grid>
    <Button x:Name="MyButton1" Width="100" Height="30" Content="MyButton1" ContextMenu="{StaticResource MyContextMenu}" />
    <Button x:Name="MyButton2" Margin="0,110,0,0" Width="100" Height="30" Content="MyButton2" ContextMenu="{StaticResource MyContextMenu}" />
</Grid>

Code behind

private void MenuItem_Click(object sender, RoutedEventArgs e)
{
    MenuItem mnu = sender as MenuItem;
    Button MyButton = null;
    if (mnu != null)
    {
        ContextMenu MyContextMenu = (ContextMenu)mnu.Parent;
        MyButton = MyContextMenu.PlacementTarget as Button;
    }
    MessageBox.Show(MyButton.Content.ToString());
}

RoutedEvents的工作方式与常规事件不同——处理程序的签名是EventHandler(对象发送方,RoutedEventArgs e)。RoutedEventArgs有一个名为OriginalSource的属性,它表示UI中实际单击的元素。相反,sender参数将始终是注册事件处理程序的对象。

使用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);
            }
        };
    }
}

最新更新