【问题标题】:How can I take different MenuItem controls and use them in one ContextMenu?如何获取不同的 MenuItem 控件并在一个 ContextMenu 中使用它们?
【发布时间】:2015-04-15 18:15:48
【问题描述】:

例如,我在 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>

产生:

我希望剪切/复制/粘贴 MenuItem 元素位于它们自己的控件中。但是,Wpf 限制我只在没有父元素的控件中声明 3 个 MenuItem。所以我尝试将 MenuItems 放在 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 文件中。但如果可能的话,我想将这三个文件都保存在一个文件中。

【问题讨论】:

    标签: wpf xaml contextmenu menuitem


    【解决方案1】:

    您可以将这些 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>
    

    【讨论】:

    • 我需要将剪切、复制和粘贴到一个单独的文件中。因此,如果它们位于单独文件的资源中,则客户端代码无法访问它。
    • 您可以将这些文件添加到 ResourceDictionary 并使用它。
    • 您将这些菜单项作为资源添加到资源字典中,然后在其他地方重复使用。
    • 我明白,但是对于我的基础架构(mef/mvvm)设置,让每个菜单项都在自己的控制中会更容易。另外,我不想从客户端单独声明每个菜单项。最好只是参考视图。我想仍然想知道是否有办法在不走资源路线的情况下做到这一点。不过感谢您的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多