WPF 样式覆盖高度

WPF Style override Height

我的 xaml 文件中有来自第三方库的元素

<core:CheckBox />

它在那个库中有它的风格

<Style x:Key="{x:Type controls:CheckBox}" TargetType="{x:Type controls:CheckBox}">
    <Style.Setters>
      <Setter Property="FrameworkElement.Width" Value="170" />
      <Setter Property="FrameworkElement.Height" Value="60" />
      <Setter Property="Control.Template">
        <Setter.Value>
          <ControlTemplate TargetType="{x:Type controls:CheckBox}">
            <controls:Button x:Name="Button" 
              Width="{TemplateBinding FrameworkElement.Width}" 
              Height="{TemplateBinding FrameworkElement.Height}"
              ...
          </ControlTemplate>
        </Setter.Value>
      </Setter>
      ...
</Style>

不幸的是,设置了高度和宽度后,它不想拉伸。

我无法修改第三方库中的Style。情况有其优点,因为如果他们更改样式,我的元素将与系统的其余部分具有统一的外观。

我想使用 Style,但不知何故放弃了 Height 和 Width setter。 有什么想法吗?

编辑: CheckBox 在 Grid 中,它不填充单元格,这就是目标。

您可以根据 third-party 默认样式创建自己的默认样式并在那里重置属性。我找到了一种使用值转换器来做到这一点的方法:

public class DummyConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return Binding.DoNothing;
        // return DependencyProperty.UnsetValue;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return Binding.DoNothing;
    }
}

此转换器不执行任何操作,也不提供绑定值。

<local:DummyConverter x:Key="Resetter"/>
<Style TargetType="{x:Type controls:CheckBox}" 
       BasedOn="{StaticResource {x:Type controls:CheckBox}}">
    <Setter Property="Height" 
            Value="{Binding RelativeSource={RelativeSource Self}, 
                            Converter={StaticResource Resetter}}"/>                    
    <Setter Property="Width" 
            Value="{Binding RelativeSource={RelativeSource Self}, 
                            Converter={StaticResource Resetter}}"/>
</Style>

宽度和高度不是有意设置的

答案在 ASh 的评论中

<Style x:Key="{x:Type controls:CheckBox}" TargetType="{x:Type controls:CheckBox}">
    <Style.Setters>
      <Setter Property="FrameworkElement.Width" Value="170" />
      <Setter Property="FrameworkElement.Height" Value="60" />
      <Setter Property="Control.Template">
        <Setter.Value>
          <ControlTemplate TargetType="{x:Type controls:CheckBox}">
            <controls:Button x:Name="Button" 
              Width="{TemplateBinding FrameworkElement.Width}" 
              Height="{TemplateBinding FrameworkElement.Height}"
              <!-- ADDED ALIGNMENT -->
              HorizontalAlignment="Stretch"
              VerticalAlignment="Stretch"
              ...
          </ControlTemplate>
        </Setter.Value>
      </Setter>
      ...
</Style>