7

我有一个这样的用户控件:

<UserControl x:Class="MyApp.UserControls.MyContextMenu"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d"
             ContextMenuOpening="OnContextMenuOpening"
             d:DesignHeight="300" d:DesignWidth="300">

    <UserControl.ContextMenu>
        <ContextMenu>
        ...
        </ContextMenu>
    </UserControl.ContextMenu>
</UserControl>

我的问题是:如何将上下文菜单用于数据网格之类的东西:

<DataGrid ContextMenu="{usercontrols:MyContextMenu}"

不幸的是,这不起作用,因为指定的值不正确并且预期为ContextMenu.

注意:我需要在几个地方重复使用我的上下文菜单,所以我把它放在了自己的文件中。另外,我需要能够收听OnContextMenuOpening事件,因为打开时的菜单需要对菜单做一些工作,并且遗憾的是,上下文菜单不会触发事件:http ://connect.microsoft.com/VisualStudio/feedback /details/353112/contextmenu-opening-event-doesnt-fire-properly

“ContextMenu 本身是一个 FrameworkElement 派生类,但不会从作为源打开的上下文菜单引发此事件。该事件是从作为属性“拥有”上下文菜单的元素引发的,并且仅在用户尝试在 UI 中打开上下文菜单。”

这个事件问题是我为用户控件放置菜单的原因——以便用户控件可以获取事件并完成工作。

更新:我试图将它作为根元素并扩展上下文菜单:

在此处输入图像描述

和代码隐藏:

在此处输入图像描述

但我得到:ContextMenu cannot have a logical or visual parent

4

2 回答 2

8

无论您如何调用 UserControl,它都不是 ContextMenu。您必须从ContextMenu而不是 UserControl 派生:

<ContextMenu x:Class="MyApp.MyContextMenu"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <MenuItem Header="Item 1"/>
    <MenuItem Header="Item 2"/>
    ...
</ContextMenu>

public partial class MyContextMenu : ContextMenu
{
    public MyContextMenu()
    {
        InitializeComponent();
    }
}

但是你为什么要这样做呢?

于 2012-05-17T12:08:47.703 回答
5

尝试像这样定义它:

<DataGrid.Resources>
    <ContextMenu x:Key="DgContextMenu">
      ...
    </ContextMenu>
</DataGrid.Resources>

并在使用后像

<DataGrid ContextMenu="{StaticResource DgContextMenu}

应该工作。

于 2012-05-17T12:09:01.823 回答