如何在WPF菜单控制设置前景色和背景色?(How to set foreground and bac

2019-07-04 19:09发布

我在WPF已经工作了相当长一段时间,但有一些基本的关于造型,我只是不明白。

我怎样才能设置前景色和背景色为Menu控制? 我开始用这样的:

    <Menu IsMainMenu="True" Background="#FF3A3A3A" Foreground="White">
        <MenuItem Header="_File">
            <MenuItem Header="_Exit">
            </MenuItem>
        </MenuItem>
    </Menu>

前景色显然是继承的MenuItem ,但背景是没有的。 一次新的尝试:

    <Menu IsMainMenu="True" Background="#FF3A3A3A" Foreground="White">
        <MenuItem Background="#FF3A3A3A" Header="_File">
            <MenuItem Header="_Exit">
            </MenuItem>
        </MenuItem>
    </Menu>

现在,当菜单被激活高亮/覆盖颜色不正确的,我没有看到一个明显的属性进行设置。 此外,在弹出菜单具有广泛的,白边,我看不出如何改变它的颜色(或大小),无论是。

我在想什么?

Answer 1:

你会想了解更多关于WPF模板和样式(XAML真的)。 在XAML中,如何控制的外观和如何控制工作是两个完全不同的事情。 在你的榜样,你可能有一个前景和背景属性,但该控件的样式\模板我不能利用这些属性控件的显示。

阅读http://wpftutorial.net/Templates.html和http://wpftutorial.net/TemplatesStyles.html ,他们会给你一个很好的和快速概述。 为了更深入地了解,请阅读本: http://msdn.microsoft.com/en-us/library/ee230084.aspx

如果您使用Visual Studio 2012编辑您的WPF UI,您可以轻松地创建菜单控件使用的样式\模板的副本,然后对其进行编辑。 如果您使用的是Visual Studio 2010中,你应该下载并安装(它可能会或可能不会是免费的),Expression Blend中编辑您的XAML UI。

提示 :如果您使用的Visual Studio 2012,请确保您的文档大纲窗格中可见所有的时间。 这是编辑XAML UI非常方便。 矿默认为被倒在了节目的左侧。 此窗格是默认情况下Expression Blend中可见。

查找文档大纲的菜单项控制。 上右键单击它并选择编辑模板 - >编辑复制...

这将在现有的菜单项的外观和感觉的副本,供您编辑。 当你这样做,你将是这个模板的编辑模式,该模式的“弹出”,点击小图标在文档大纲窗口的左上角。

当编辑模板,你可以看到模板的布局和设计。 当菜单项正在为下拉部分,它确实显示像一个弹出菜单(右键菜单)。 通过该模板看,什么我弹出来就被命名为SubMenuBackgroundBrush这种颜色资源:

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

如果您对SubMenuBackgroundBrush做一个搜索,你可以看到它是在一个名为PART_Popup部分使用:

<Popup x:Name="PART_Popup" AllowsTransparency="true" Focusable="false" HorizontalOffset="1" IsOpen="{Binding IsSubmenuOpen, RelativeSource={RelativeSource TemplatedParent}}" PopupAnimation="{DynamicResource {x:Static SystemParameters.MenuPopupAnimationKey}}" Placement="Bottom" VerticalOffset="-1">
    <Themes:SystemDropShadowChrome x:Name="Shdw" Color="Transparent">
        <Border x:Name="SubMenuBorder" BorderBrush="#FF959595" BorderThickness="1" Background="{StaticResource SubMenuBackgroundBrush}">
            <ScrollViewer x:Name="SubMenuScrollViewer" Margin="1,0" Style="{DynamicResource {ComponentResourceKey ResourceId=MenuScrollViewer, TypeInTargetAssembly={x:Type FrameworkElement}}}">
                <Grid RenderOptions.ClearTypeHint="Enabled">
                    <Canvas HorizontalAlignment="Left" Height="0" VerticalAlignment="Top" Width="0">
                        <Rectangle x:Name="OpaqueRect" Fill="{StaticResource SubMenuBackgroundBrush}" Height="{Binding ActualHeight, ElementName=SubMenuBorder}" Width="{Binding ActualWidth, ElementName=SubMenuBorder}"/>
                    </Canvas>
                    <Rectangle Fill="#F1F1F1" HorizontalAlignment="Left" Margin="1,2" RadiusY="2" RadiusX="2" Width="28"/>
                    <Rectangle Fill="#E2E3E3" HorizontalAlignment="Left" Margin="29,2,0,2" Width="1"/>
                    <Rectangle Fill="White" HorizontalAlignment="Left" Margin="30,2,0,2" Width="1"/>
                    <ItemsPresenter x:Name="ItemsPresenter" KeyboardNavigation.DirectionalNavigation="Cycle" Grid.IsSharedSizeScope="true" Margin="2" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" KeyboardNavigation.TabNavigation="Cycle"/>
                </Grid>
            </ScrollViewer>
        </Border>
    </Themes:SystemDropShadowChrome>
</Popup>

这就是你看到的,当你的东西,显示菜单或下拉菜单中单击鼠标右键弹出。 :更改从引用{StaticResource SubMenuBackgroundBrush}{TemplateBinding Foreground}

当你运行程序,你会看到弹出窗口的主要背景发生了变化,但其中显示的图标的区域也没有。 这些都是<Rectangle Fill=" ,在弹出的控制项目了。改变这些也。最后参考矩形看起来像它的线分割的图标和文字,你可能不会有什么改变这种状况。

享受模板的精彩世界。 它看起来混乱,想了很多的工作。 它是。 但是,当你得到它的窍门,这是一个非常酷的系统。 很难你得到它挂回去后任何其他UI系统。



Answer 2:

我在想什么?

控制都或多或少的定制,并有定制控制的两个层次:

  1. 设置属性,如ForegroundBackground等,在您将控制在XAML。
  2. 设置Template在你的Style的控制,并创建自己的ControlTemplate

二是更多地参与,但它在使控制看你想怎么提供了更大的灵活性。 如果这种情况下,这听起来像这就是你所需要的。 退房的菜单和菜单项的默认控件模板 。 您可以复制/粘贴它们并根据需要修改。

<Window.Resources>
    <Style TargetType="{x:Type Menu}">
        <Setter Property="Template">
            <ControlTemplate TargetType="{x:Type Menu}">
                <!-- your modified template here -->
            </ControlTemplate>
        </Setter>
    </Style>
    <Style TargetType="{x:Type MenuItem}">
        <Setter Property="Template">
            <ControlTemplate TargetType="{x:Type MenuItem}">
                <!-- your modified template here -->
            </ControlTemplate>
        </Setter>
    </Style>
</Window.Resources>


文章来源: How to set foreground and background colors on a WPF Menu control?