WPF样式覆盖高度

时间:2018-04-05 05:49:17

标签: .net wpf dependency-properties wpf-style

我的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中,它不会填充单元格,这就是目标。

2 个答案:

答案 0 :(得分:2)

您可以根据第三方默认样式创建自己的默认样式,并在那里重置属性。我找到了一种使用值转换器的方法:

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>

未有意设置宽度和高度

答案 1 :(得分:0)

答案在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>