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

red*_*sky 3 .net c# wpf

我在 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>
Run Code Online (Sandbox Code Playgroud)

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

当左键单击打开上下文菜单时,我定义的样式不会应用于菜单,如下所示:

该样式不适用于左键单击。

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

第一次右键单击时会正确应用样式。

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

右键单击后,左键单击的样式正确。

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

kma*_*zek 5

您应该在代码中分配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;
}
Run Code Online (Sandbox Code Playgroud)

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

ContextMenu 附加到特定控件。ContextMenu 元素使您能够向用户呈现一个项目列表,这些项目指定与特定控件(例如按钮)关联的命令或选项。用户右键单击控件即可显示菜单。...

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