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>
我的 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>