【问题标题】:C# WPF Context menu item click event returns nullC# WPF 上下文菜单项单击事件返回 null
【发布时间】:2018-01-25 22:14:15
【问题描述】:

我正在使用带有 C# 的 WPF。我有一个按钮网格,如果右键单击,我已经为每个按钮分配了一个上下文菜单。右键单击按钮可以正常工作,并且会显示上下文菜单,但单击菜单项会产生空发件人。有什么问题?以下是嵌入到 Window XAML 代码中的相关代码:

 <Window.Resources>
    <ContextMenu x:Key="cmButton">
        <MenuItem Header="Copy" Click="Copy_Click" />
        <MenuItem Header="Cut" />
        <Separator />
        <MenuItem Header="Paste" Click="Paste_Click" />
    </ContextMenu>
 </Window.Resources>

这里是相关的 C# 代码:

public void WarpHeadCell_RightClick(DraftWindow w, Button b)
    {
        ContextMenu cm = w.FindResource("cmButton") as ContextMenu;
        cm.PlacementTarget = b;
        cm.IsOpen = true;         
    } 

 private void Copy_Click(object sender, RoutedEventArgs e)
   {
       MenuItem mi = e.OriginalSource as System.Windows.Controls.MenuItem;
       ContextMenu cm = mi.ContextMenu;
       Button b = (Button)cm.PlacementTarget;   
   }

mi 始终为空,有人知道吗?

【问题讨论】:

    标签: c# wpf contextmenu


    【解决方案1】:

    我看不出 mi 为空的任何原因,但你没有包括所有内容,所以我在这里冒险并猜测 mi.ContextMenu 是你遇到问题的地方。菜单项本身没有 ContextMenu,但它确实有 Parent 属性,这是它所属的 ContextMenu,可能是您要查找的内容。

    private void Copy_Click(object sender, RoutedEventArgs e)
    {
        MenuItem mi = sender as MenuItem;
        ContextMenu cm = mi.Parent as ContextMenu;
        Button b = cm.PlacementTarget as Button;
    }
    

    【讨论】:

    • 非常感谢。它奏效了!我真的很感激,我向你致以最美好的祝愿。
    【解决方案2】:

    这是我的 XAML:

       <Window.Resources>
            <ContextMenu x:Key="cmButton">
                <MenuItem Click="Copy_Click" Header="Copy" />
                <MenuItem Header="Cut" />
                <Separator />
                <MenuItem Click="Paste_Click" Header="Paste" />
            </ContextMenu>
        </Window.Resources>
        <Grid>
            <Button Content="SS" ContextMenu="{StaticResource cmButton}" />
        </Grid>
    

    这是我的代码:

       private void Paste_Click(object sender, RoutedEventArgs e)
            {
                if (sender is MenuItem menuItem)
                {
                    Debug.WriteLine("Ok");
                }
    
                if (e.OriginalSource is MenuItem menuItem2)
                {
                    Debug.WriteLine("Ok");
                }
            }
    

    有效,menuItem 和 menuItem2 不为空 你可以在这里下载我的rar: https://1drv.ms/u/s!AthRwq2eHeRWiOkw6MHXelG-ntjaDQ

    【讨论】:

    • 非常感谢您的回答。我会尝试下载你的 rar 并试一试。但是由于某些原因我需要动态生成网格按钮,所以还有其他方法可以使它工作吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多