我在WPF的工具栏上有按钮。
当我做XAML时:
<ToolBar.Resources>
<Style TargetType="{x:Type Button}">
<Setter Property="Width" Value="21"></Setter>
<Setter Property="Height" Value="21"></Setter>
</Style>
</ToolBar.Resources>
工具栏上的所有按钮都没有相应地设置尺寸。
我必须转到每个按钮并手动将其宽度和高度设置为所需的值。
知道为什么工具栏上的样式不起作用?
答案 0 :(得分:9)
这是因为ToolBar将ToolBar.ButtonStyleKey标识的样式应用于按钮,而不是将它们保留为默认样式。 (这就是为什么即使提出默认样式,工具栏中的按钮也是平的。)你需要“劫持”这种风格,而不是默认风格:
<ToolBar.Resources>
<Style x:Key="{x:Static ToolBar.ButtonStyleKey}" TargetType="Button">
<Setter Property="Width" Value="100" />
</Style>
</ToolBar.Resources>
注意样式声明中的x:Key。
答案 1 :(得分:2)
如果要将硬编码按钮添加到工具栏,可以将ToolBar.ItemContainerStyle设置为自定义样式以获得所需的效果。
<ToolBar.ItemContainerStyle>
<Style
TargetType="Button">
<Setter
Property="Width"
Value="21" />
<Setter
Property="Height"
Value="21" />
</Style>
</ToolBar.ItemContainerStyle>
如果您使用的是ToolBar.ItemsSource,则可以使用ToolBar.ItemTemplate为工具栏数据定义模板。
<ToolBar.ItemTemplate>
<DataTemplate>
<Button
Width="21"
Height="21"
Content="{Binding}" />
</DataTemplate>
</ToolBar.ItemTemplate>
请注意,在某些情况下,可以同时使用这两种方法以获得额外的灵活性。
这不仅适用于工具栏,也适用于ItemsControl的所有派生。
祝你好运,
答案 2 :(得分:0)
如the other answer中所述,工具栏将自动将其样式应用于添加到其中的许多/最典型的控件。
作为劫持其样式键或将自己的样式手动应用于控件的替代方法,您可以替代覆盖其方法的方法,该方法首先设置其内部样式。简单的例子:
public class LessIsMoreToolbar : ToolBar
{
protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
{
// Nada
}
}
,然后在您的XAML中使用<local:LessIsMoreToolbar>
而不是<Toolbar>
。
请注意,这里PrepareContainerForItemOverride()
不会专门调用base.PrepareContainerForItemOverride()`。这就是消除样式设置的原因。您可以view the base's version of this method yourself来验证这并不能消除您需要的任何东西。
一个警告是PrepareContainerForItemOverride
is defined by ItemsControl,就像Toolbar
的曾祖父母一样。此方法的版本开始了其他一些Prepare...
情况,您也应注意不要破坏任何情况。您不能(or perhaps shouldn't)直接调用该版本的方法。
但是最后,如果它对您有用,那么这是一个很好的简单方法。