如何在一个ContextMenu中使用不同的MenuItem控件并使用它们?

时间:2015-04-15 18:15:48

标签: wpf xaml contextmenu menuitem

例如,我在xaml中有一个简单的控件:

<ContextMenu>
    <MenuItem Header = "Open in new tab"/>
    <MenuItem Header = "Open in new window"/>
    <MenuItem Header = "Open in incognito window"/>
    <Separator Padding="0"/>
    <MenuItem Header = "Edit..."/>
    <Separator Padding="0"/>
    <MenuItem Header = "Cut"/>
    <MenuItem Header = "Copy"/>
    <MenuItem Header = "Paste"/>
    <Separator Padding="0"/>
    <MenuItem Header = "Delete"/>
</ContextMenu>

产生:

ContextMenu

我希望剪切/复制/粘贴MenuItem元素位于自己的控件中。但是,Wpf限制我在没有父元素的控件中声明3个MenuItems。所以我尝试将MenuItem放在Menu,Grid,ItemsControl和其他控件中,没有运气。格式化很奇怪。我想要做的就是将剪切/复制/粘贴抽象为单独的控件,并使最终产品看起来与上面的xaml相同。以下是我失败的尝试:

MyContextMenu.xaml:

<ContextMenu>
    <MenuItem Header = "Open in new tab"/>
    <MenuItem Header = "Open in new window"/>
    <MenuItem Header = "Open in incognito window"/>
    <Separator Padding="0"/>
    <MenuItem Header = "Edit..."/>
    <Separator Padding="0"/>
    <ref:MyCutCopyPaste/>
    <Separator Padding="0"/>
    <MenuItem Header = "Delete"/>
</ContextMenu>

MyCutCopyPaste.xaml:

<Grid>
    <MenuItem Header = "Cut"/>
    <MenuItem Header = "Copy"/>
    <MenuItem Header = "Paste"/>
<Grid>

我可以采取我的解决方案并使用格式化,但必须有一个简单的解决方案,我也不会忘记。我知道我也可以将每个菜单项(剪切,复制和粘贴)声明到它自己的xaml文件中。但是如果可能的话,我想将所有三个文件保存在一个文件中。

1 个答案:

答案 0 :(得分:0)

您可以将这些MenuItem定义为资源,并在上下文菜单中使用它。请参阅以下代码。

<StackPanel>
        <StackPanel.Resources>                
            <MenuItem x:Key="Cut" Header="Cut" x:Shared="false"/>
            <MenuItem x:Key="Copy" Header="Copy" x:Shared="false"/>
            <MenuItem x:Key="Paste" Header="Paste" x:Shared="false"/>
        </StackPanel.Resources>
        <Button Content="Button 1">
            <Button.ContextMenu>
                <ContextMenu>
                    <StaticResourceExtension ResourceKey="Cut"/>
                    <StaticResourceExtension ResourceKey="Copy"/>
                    <StaticResourceExtension ResourceKey="Paste"/>
                    <MenuItem Header="Open in new tab"/>
                </ContextMenu>
            </Button.ContextMenu>
        </Button>
        <Button Content="Button 2">
            <Button.ContextMenu>
                <ContextMenu>
                    <StaticResourceExtension ResourceKey="Cut"/>
                    <StaticResourceExtension ResourceKey="Copy"/>
                    <StaticResourceExtension ResourceKey="Paste"/>
                    <MenuItem Header="Open in new window"/>
                </ContextMenu>
            </Button.ContextMenu>
        </Button>
    </StackPanel>