工具栏按钮样式被忽略了吗?

8

我在 WPF 的工具栏上有按钮。

当我写 XAML 代码时:

<ToolBar.Resources>
   <Style TargetType="{x:Type Button}">
      <Setter Property="Width" Value="21"></Setter>
      <Setter Property="Height" Value="21"></Setter>
   </Style>
</ToolBar.Resources>

工具栏上的按钮没有按比例设置它们的大小。
我必须逐个按钮手动设置宽度和高度为期望值。
你有什么想法为什么工具栏上的样式不起作用?
3个回答

12
这是因为ToolBar将由ToolBar.ButtonStyleKey标识的样式应用于按钮,而不是让它们保持默认样式。这就是为什么工具栏中的按钮是平的,即使默认样式是凸起的原因。参考链接
您需要“劫持”这种样式,而不是默认样式:
<ToolBar.Resources>
  <Style x:Key="{x:Static ToolBar.ButtonStyleKey}" TargetType="Button">
    <Setter Property="Width" Value="100" />
  </Style>
</ToolBar.Resources>

注意 Style 声明中的 x:Key。


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的衍生产品。
祝你好运,

0

其他回答中所指出的,工具栏会自动为添加到其中的大多数典型控件应用自己的样式。

作为替代方案,你可以重写设置工具栏内部样式的方法,而不是篡改它的样式键或手动应用自己的样式到控件上。以下是简单的示例:

public class LessIsMoreToolbar : ToolBar
{
    protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
    {
        // Nada
    }
}

然后在你的XAML中使用<local:LessIsMoreToolbar>代替<Toolbar>

请注意,这里的PrepareContainerForItemOverride()特别不调用base.PrepareContainerForItemOverride()。这就是消除样式设置的原因。你可以查看自己的方法基础版本来验证这不会消除任何你需要的内容。

一个注意点是,PrepareContainerForItemOverride由ItemsControl定义,它类似于Toolbar的高祖父。它的这个方法版本会启动一些其他的Prepare...情况,你也应该小心不要破坏任何东西。你不能(或者可能不应该)直接调用该方法的版本。

但是最终如果这对你有效,那么这是一个不错的简单方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接