右键单击之前不应用上下文菜单样式

Posted

技术标签:

【中文标题】右键单击之前不应用上下文菜单样式【英文标题】:Context Menu Style not applied until right click 【发布时间】:2013-10-24 19:05:23 【问题描述】:

我在 WPF (.NET 4.0) 中的一个控件的工具栏上的一个按钮上附加了一个上下文菜单。在定义上下文菜单的 XAML 中,上下文菜单具有分配给它的样式。如果按钮尚未打开,左键单击按钮会打开按钮的上下文菜单。

这是相关的 XAML:

<Button x:Name="fileButton" Foreground="White" Margin="7, 0, -3, 0" VerticalAlignment="Stretch" MaxHeight="70" MaxWidth="78" MinHeight="55" MinWidth="62" Style="DynamicResource ImageButton" utils:WpfImageUtil.Image="StaticResource fileButton" Template="DynamicResource GlassButton" Content="File" Visibility="Visible" Click="fileButton_Click">
    <Button.ContextMenu>
        <ContextMenu Style="DynamicResource ContextMenuStyle">
            <MenuItem x:Name="saveMenuItem" Header="Save" Click="saveMenuItem_Click" Style="DynamicResource MenuItemStyle" />
            <MenuItem x:Name="saveDrawingMenuItem" Header="Save Drawing" Click="saveMenuItem_Click" Style="DynamicResource MenuItemStyle" />
            <MenuItem x:Name="openMenuItem" Header="Open" Style="DynamicResource MenuItemStyle">
                <MenuItem x:Name="openFromFile" Header="From File" Style="DynamicResource MenuItemStyle" />
                <MenuItem x:Name="openFromDesktop" Header="From Desktop" Style="DynamicResource MenuItemStyle" />
            </MenuItem>
            <MenuItem x:Name="iconsMenuItem" Header="Icons" ItemsSource="Binding" Style="DynamicResource MenuItemStyle"/>
            <MenuItem x:Name="prefsMenuItem" Header="Preferences" Style="DynamicResource MenuItemStyle"/>
        </ContextMenu>
    </Button.ContextMenu>
</Button>

ContextMenuStyle 在正确引用的资源字典中定义。

当鼠标左键打开上下文菜单时,我定义的样式并没有应用到菜单上,如下图:

但是,如果用户右键单击并以传统方式打开上下文菜单,则样式将按预期应用:

然后,左键单击按钮将正确显示样式:

一段时间以来,我一直在尝试解决这个问题,但一直无法找到出现此问题的任何原因。这对我来说似乎是某种错误,但我并不完全确定。我也不知道右键单击控件会导致正确应用样式时在较低级别会发生什么。

【问题讨论】:

【参考方案1】:

您应该在代码中分配ContextMenu Style 属性(FindResource 方法msdn):

private void fileButton_Click(object sender, RoutedEventArgs e)

    if (fileButton.ContextMenu.Style == null)
        fileButton.ContextMenu.Style = this.FindResource("ContextMenuStyle") as Style;
    fileButton.ContextMenu.IsOpen = true;

上下文菜单概述 (http://msdn.microsoft.com/en-US/library/ms742558.aspx)

ContextMenu 附加到特定控件。上下文菜单 元素使您能够向用户呈现指定的项目列表 与特定控件关联的命令或选项,例如 例如,一个按钮。用户右击控件制作菜单 出现。 ...

当您右键单击控件时,样式将应用于ContextMenu。所以如果你想在代码中打开ContextMenu,你应该检查style是否等于null,如果为true,你应该分配适当的样式。

【讨论】:

这已经完成了大部分。由于某种原因,项目的填充仍然没有正确设置。您是否可以授予我任何其他见解? 其实我想是因为我还要在后面的代码中设置菜单项的样式。我要那样做。感谢您的帮助!

以上是关于右键单击之前不应用上下文菜单样式的主要内容,如果未能解决你的问题,请参考以下文章

使用新服务项更新 OSX 右键单击​​上下文菜单

在窗口范围内限制/移动上下文菜单(右键单击)

如何从“右键单击”上下文菜单(Windows 资源管理器)中选择多个文件以启动同一个应用程序

从 PyCharm 社区版中的鼠标右键单击上下文菜单运行/调试 Django 应用程序单元测试?

MS Access 2010 运行时 - 连续表单中缺少鼠标右键单击上下文菜单

PySide QPushButton 右键单击​​上下文菜单未分配每个按钮