如何将纯色设置为整个菜单的背景?

时间:2009-11-12 23:06:39

标签: c# wpf menu

如何修改我的菜单,使其始终显示颜色,而不是像这样:

alt text

这是我的代码:

<DockPanel>
    <Menu DockPanel.Dock="Right"
          Height="30"              
          VerticalAlignment="Top"
          Background="#2E404B"
          BorderThickness="2.6" 
          Foreground="#FFAA00">
        <Menu.BitmapEffect>
            <DropShadowBitmapEffect Direction="270" ShadowDepth="3" Color="#2B3841"/>
        </Menu.BitmapEffect>

        <MenuItem Header="File" >
            <MenuItem Header="New Build" Background="#2E404B"></MenuItem>
            <Separator />
            <MenuItem Header="Exit" Background="#2E404B"></MenuItem>
        </MenuItem>

        <MenuItem Header="Edit" >
            <MenuItem Header="Language" Background="#2E404B"></MenuItem>
            <MenuItem Header="Display Mode" Background="#2E404B"></MenuItem>
            <Separator />
            <MenuItem Header="Settings" Background="#2E404B"></MenuItem>
        </MenuItem>

        <MenuItem Header="View" >

        </MenuItem>
        <MenuItem Header="About" >

        </MenuItem>
    </Menu>
</DockPanel>

另外,我意识到我在MenuItem的所有实例中都设置了颜色,如果有人能告诉我一种更有效的方式,那也是很棒的。 :d

3 个答案:

答案 0 :(得分:4)

难点在于您需要的颜色深埋在Menu主题样式中。这些主题样式是WPF附带的一些最复杂的主题样式。它们由10-20种样式和模板组成。

一般来说,我建议创建类似于itowlson答案中的样式,因为它允许您优雅地适应当前的Windows主题,只替换您想要的属性和模板,并保留其他所有内容。

在你的情况下,通过添加单个标签来重复覆盖主题样式很可能是徒劳的。幸运的是,您不需要这样做

显然,您实际上是尝试从用户体验的角度创建自己的自定义主题,那么为什么不在代码中实际创建自己的主题?您可以通过从Aero或Luna(根据您的喜好)复制主题并更改您想要的任何内容来轻松完成此操作。

使用Expression Blend非常简单。只是:

  1. 创建一个空窗口并向其添加一个菜单。
  2. 右键单击菜单,然后选择Edit Control Parts (Template) > Edit a Copy...
  3. 在对话框中,选择Apply to All,然后点击New旁边的Resource dictionary
  4. 输入新的ResourceDictionary文件名,例如“MyMenuTheme.xaml”
  5. 在App.xaml中,使用MergedDictionaries将MyMenuTheme.xaml包含到您的应用程序资源中
  6. 现在,您可以对MyMenuTheme.xaml进行任何更改,以影响应用程序中所有菜单的外观。此文件将长达数百行,但通常很容易找到要更改的正确设置。在您的情况下,它将是背景设置的各种默认值。

    请注意,如果您没有Expression Blend,您还可以使用反射器和BAMLViewer来获取主题样式,但这需要更多工作,因为您必须手动选择所需的样式和其他资源。 / p>

答案 1 :(得分:0)

要在所有MenuItem实例上设置背景,请为MenuItem定义样式:

<Style x:Key="{x:Type MenuItem}">
  <Setter Property="Background" Value="#2E404B" />
</Style>

你应该能够对Separator类进行同样的操作来抛光剩余的位,但是由于对比度问题,你可能想要设置整个模板的样式而不仅仅是背景。

或者,您可能需要/想要劫持MenuItem.SeparatorStyleKeyMenuItem.TopLevelItemTemplateKey等。

答案 2 :(得分:0)

转到App.xaml或使用Ctrl + F查找此吸盘

<SolidColorBrush x:Key="SubMenuBackgroundBrush" Color="#FF9B9B9B"/>