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

时间:2015-07-23 07:21:12

标签: 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>

1 个答案:

答案 0 :(得分:3)

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

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

<Trigger Property="IsEnabled" Value="True">
    <Setter Property="Style" Value="{StaticResource DotcomTabItemStyle}" />
</Trigger>

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

不管怎样,你最终会为每个属性添加不同的Setter,可能要么修改你已经拥有的DotcomTabItemStyle样式,要么创建一个新的(可能是基于那个)。

编辑 - 或者您可以使用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>

编辑2 - 或者......您可以使用样式选择器。像TabControl这样的ItemsControl有一个名为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;
    }
}

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

相关问题