我正在尝试将嵌套的WPF样式应用于工具栏。我想让工具栏的所有子项(MenuItems,Buttons,ToggleButtons等)具有指定的样式。
问题是,嵌套样式定义是否正确应用于某些控件(如MenuItems),而不是按钮。 我做错了什么?
MenuItem正确放置在工具栏的底部,但ToggleButton位于中间位置:
<Window.Resources>
<Style x:Key="MyToolbarStyle" TargetType="ToolBar">
<!-- Setters for Toolbar properties -->
<Setter Property="Height" Value="80" />
<!-- Nested setters for children of the Toolbar -->
<Style.Resources>
<Style TargetType="MenuItem">
<Setter Property="VerticalAlignment" Value="Bottom" />
</Style>
<Style TargetType="ToggleButton">
<Setter Property="VerticalAlignment" Value="Bottom" />
</Style>
</Style.Resources>
</Style>
</Window.Resources>
<Grid >
<ToolBar VerticalAlignment="Top" Style="{StaticResource MyToolbarStyle}">
<MenuItem Header="MyMenuItem" /> <!-- Appears on the bottom like defined in the style-->
<ToggleButton Content="MyToggleButton" /> <!-- Nested style does not seem to be applied-->
</ToolBar>
</Grid>
答案 0 :(得分:3)
WPF ToolBar
是一种特殊类型的控件,可为某些WPF控件定义一些自定义样式,例如Button
,ToggleButton
...完整列表here,您可以通过ElementName + StyleKey
属性名称识别它们。如果您想要更改特定控件的默认样式,则必须修改其中一种样式。
尝试使用以下内容替换ToggleButton
的样式:
<Style x:Key="{x:Static ToolBar.ToggleButtonStyleKey}" TargetType="ToggleButton">
<Setter Property="VerticalAlignment" Value="Bottom" />
</Style>
答案 1 :(得分:0)
你错误的是认为WPF Style
就像CSS
个样式。在WPF中,Style
只是没有这样使用。当然,如果可以,我们可能会保存几行XAML,但我们不能。我们能做的最好的就是你所做的......我假设你为Style
这样的顶级元素创建了Control
。如您所见,并非所有控件都会扩展Control
类,因此Style
不会应用于所有控件。
相反,WPF中的Style
更像是CSS中的.class
样式...每种类型一个Style
,然后我们可以为每个UI应用更多Style
元件。在WPF中有很多这样的情况,我们希望我们可以编写更少的代码,但事实就是这样,每个人越早意识到它就越好。
更新&gt;&gt;&gt;
在回复您的第一条评论时,您似乎错了。只是为了澄清一下,如果您正在调用嵌套的Style
s 是您在外部Style
部分中定义的Style.Resources
,那么没有任何问题那......没有问题。只需从Style
部分中取出内部Resources
,您就会看到相同的用户界面。
现在您可能正在考虑将问题标题更改为“为什么我的默认ToggleButton Style
未在ToolBar
控件中应用?”。虽然我不能肯定地说,但我只能假设此行为是由Style
中定义的ToolBar ControlTemplate
引起的。
我想是因为以下几点:
Style
(无x:键)在ToolBar
控件内不起作用。 Style
(已命名)将在ToolBar
控件内按预期工作。 Style
属性将在ToolBar
控件内按预期工作。