右键单击后才应用上下文菜单样式

时间:2013-10-24 19:05:23

标签: c# .net 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>

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

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

The style isn't applied on left click.

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

The style is correctly applied on the first right click.

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

After the right click, left click is styled properly.

我一直试图解决这个问题已经有一段时间了,但是却无法找出出现这个问题的任何理由。对我来说这似乎是一种错误,但我并不完全确定。我也不知道右键单击控件时在较低级别会发生什么情况会导致样式正确应用。

1 个答案:

答案 0 :(得分:4)

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

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;
}

ContextMenu概述(http://msdn.microsoft.com/en-US/library/ms742558.aspx

  

ContextMenu附加到特定控件。 ContextMenu   element使您可以向用户显示指定的项目列表   与特定控件关联的命令或选项   例如,一个按钮。用户右键单击该控件以生成菜单   出现。 ...

右键单击控件时,样式将应用于ContextMenu。因此,如果要在代码中打开ContextMenu,则应检查样式是否为null,如果为真,则应指定适当的样式。