如何在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>

如何在WPF中设置元素的样式属性

既然你是通过样式来设置触发器,那么改变样式也会删除触发器…我不确定这是否可行: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;
    }
}

我从来没有使用过样式选择器,所以我不确定这是否会开箱工作,但至少你知道的。