我在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>
现在,当菜单被激活高亮/覆盖颜色不正确的,我没有看到一个明显的属性进行设置。 此外,在弹出菜单具有广泛的,白边,我看不出如何改变它的颜色(或大小),无论是。
我在想什么?
你会想了解更多关于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系统。
我在想什么?
控制都或多或少的定制,并有定制控制的两个层次:
- 设置属性,如
Foreground
, Background
等,在您将控制在XAML。 - 设置
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>