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

Sun*_*nny 3 c# wpf

如果 IsEnabled 属性为 true,则需要设置 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>
Run Code Online (Sandbox Code Playgroud)

alm*_*ulo 5

由于您通过样式设置触发器,因此更改样式也会删除触发器......不确定是否会解决:P

无论如何,您在Setter(直接设置资源名称,而不是通过静态或动态资源引用)上犯了一个错误。而且你不需要一个DataTrigger. 它应该是:

<Trigger Property="IsEnabled" Value="True">
    <Setter Property="Style" Value="{StaticResource DotcomTabItemStyle}" />
</Trigger>
Run Code Online (Sandbox Code Playgroud)

但正如我所说,这可能不会按预期工作,因为您正在尝试从当前样式中修改 Style 属性......

以一种或另一种方式,您最终会为每个属性添加不同的 Setter,可能要么修改DotcomTabItemStyle您已有的样式,要么创建一个新样式(可能基于该样式)。

编辑- 或者您可以使用转换器并将 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

你像这样使用它:

<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>
Run Code Online (Sandbox Code Playgroud)

编辑 2 - 或...您可以使用样式选择器。ItemsControls 类似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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我从来没有使用过样式选择器,所以我不确定这是否可以开箱即用,但至少你明白了。