如何在WPF中设置元素的样式属性
本文关键字:元素 样式 属性 设置 WPF | 更新日期: 2023-09-27 18:04:15
如果IsEnabled属性为true,则需要设置Style属性,否则不应该设置。在我目前看到的示例中,设置了样式属性,但没有设置style属性本身。下面的代码不能使用触发器。
<TabItem.Style>
<Style TargetType="TabItem">
<Style.Triggers>
<DataTrigger Binding="{Binding IsEnabled}" Value="True">
<Setter Property="Style" Value="DotcomTabItemStyle" />
</DataTrigger>
</Style.Triggers>
</Style>
</TabItem.Style>
既然你是通过样式来设置触发器,那么改变样式也会删除触发器…我不确定这是否可行:P
无论如何,您在Setter
上犯了一个错误(直接设置资源名称,而不是通过静态或动态资源引用)。你不需要DataTrigger
。应该是:
<Trigger Property="IsEnabled" Value="True">
<Setter Property="Style" Value="{StaticResource DotcomTabItemStyle}" />
</Trigger>
但是正如我所说的,这可能不会像预期的那样工作,因为你试图从当前的Style中修改Style属性…
无论如何,你最终会为每个属性添加不同的setter,可能是修改你已经拥有的DotcomTabItemStyle
样式,或者创建一个新的(基于那个,也许)。
EDIT -或者您可以使用Converter并将Style属性绑定到IsEnabled属性。
我已经为所有这些情况创建了一个可重用的转换器:
public class ConditionalSetterConverter : IValueConverter
{
public bool Inverse { get; set; }
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
bool flag = (bool)value;
if (flag ^ Inverse)
return parameter;
else
return Binding.DoNothing;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
你可以这样使用:
<Window>
<Window.Resources>
<converters:ConditionalSetterConverter x:Key="InverseConditionalSetterConverter"
Inverse="True" />
<Style x:Key="DotcomTabItemStyle" TargetType="TabItem">...</Style>
</Window.Resources>
<TabControl>
<TabItem Style="{Binding IsEnabled,
RelativeSource={RelativeSource Mode=Self},
Converter={StaticResource InverseConditionalSetterConverter},
ConverterParameter={StaticResource DotcomTabItemStyle}}" />
</TabControl>
</Window>
EDIT 2 - OR…您可以使用样式选择器。像TabControl
这样的控件有一个名为ItemContainerStyleSelector
的属性,类型为StyleSelector
。
您必须创建自己的类,继承StyleSelector
,并覆盖SelectStyle
函数以包含您的自定义逻辑。
像这样:
public class DotcomTabItemStyleEnabledSelector : StyleSelector
{
private Style style = null;
public override System.Windows.Style SelectStyle(object item, System.Windows.DependencyObject container)
{
var tabItem = container as TabItem;
if (tabItem != null && tabItem.IsEnabled)
{
if (style == null)
style = textBox.TryFindResource("DotcomTabItemStyle") as Style;
return style;
}
return null;
}
}
我从来没有使用过样式选择器,所以我不确定这是否会开箱工作,但至少你知道的。