【问题标题】:Consolidating common WPF Styles合并常见的 WPF 样式
【发布时间】:2013-04-04 14:51:39
【问题描述】:

我的 WPF XAML 中有各种 Style 元素,除了数据绑定属性外,它们是相同的,例如:

<Style x:Key="HasAlphaStyle" TargetType="TextBlock">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=HasAlpha, UpdateSourceTrigger=PropertyChanged}" Value="True">
            <Setter Property="Background" Value="Red"/>
            <Setter Property="Foreground" Value="White"/>
            <Setter Property="FontWeight" Value="Bold"/>                   
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=HasAlpha, UpdateSourceTrigger=PropertyChanged}" Value="False">
            <Setter Property="Background" Value="LightGreen"/>
            <Setter Property="Foreground" Value="Black"/>
            <Setter Property="FontWeight" Value="Normal"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

<Style x:Key="HasBetaStyle" TargetType="TextBlock">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=HasBeta, UpdateSourceTrigger=PropertyChanged}" Value="True">
            <Setter Property="Background" Value="Red"/>
            <Setter Property="Foreground" Value="White"/>
            <Setter Property="FontWeight" Value="Bold"/>                   
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=HasBeta, UpdateSourceTrigger=PropertyChanged}" Value="False">
            <Setter Property="Background" Value="LightGreen"/>
            <Setter Property="Foreground" Value="Black"/>
            <Setter Property="FontWeight" Value="Normal"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

样式应用于如下控件:

<TextBlock Style="{StaticResource HasAlphaStyle}" .../>

有没有一种方法可以合并我的 HasAlphaStyle 和 HasBetaStyle,以便不必重复属性设置器?两者之间的唯一区别是属性的绑定路径。

【问题讨论】:

  • 有趣的问题,合并的目的是为了让你可以只为 setter 维护一组值吗?您是否希望能够将其仅应用于 TextBlocks 或任何 FrameworkElement?
  • 1.是的; 2. 可以对任何FrameworkElement重复使用的任何setter集合

标签: wpf xaml styles wpf-4.0


【解决方案1】:

我会创建一个附加属性并在其上设置触发器,而不是使用数据触发器。示例代码如下:

附加属性

public static class TextBlockBehavior
{
        public static readonly DependencyProperty HasValueProperty = 
            DependencyProperty.RegisterAttached("HasValue", typeof(bool), typeof(TextBlockBehavior),
            new FrameworkPropertyMetadata(true, FrameworkPropertyMetadataOptions.None));

        public static void SetHasValue(DependencyObject depObject, bool value)
        {
            depObject.SetValue(HasValueProperty, value);
        }

        public static bool GetHasValue(DependencyObject depObject)
        {
            return (bool)depObject.GetValue(HasValueProperty);
        }
}

然后你的组合风格会变成

<Style x:Key="HasValueStyle" TargetType="TextBlock">
    <Style.Triggers>
        <Trigger Property="behaviors:TextBlockBehavior.HasValue" Value="True">
            <Setter Property="Background" Value="Red"/>
            <Setter Property="Foreground" Value="White"/>
            <Setter Property="FontWeight" Value="Bold"/>                   
        </Trigger>
        <Trigger Property="behaviors:TextBlockBehavior.HasValue" Value="False">
            <Setter Property="Background" Value="LightGreen"/>
            <Setter Property="Foreground" Value="Black"/>
            <Setter Property="FontWeight" Value="Normal"/>
        </Trigger>
    </Style.Triggers>
</Style>

你可以把你的文本块写成

<TextBlock Style="{StaticResource HasValueStyle}"
           behaviors:TextBlockBehavior.HasValue="{Binding Path=HasAlpha, UpdateSourceTrigger=PropertyChanged}"            .../>

<TextBlock Style="{StaticResource HasValueStyle}"
           behaviors:TextBlockBehavior.HasValue="{Binding Path=HasBeta, UpdateSourceTrigger=PropertyChanged}"            .../>

【讨论】:

  • 什么是“行为:”?那是一个命名空间吗? TextBlockBehavior 在什么命名空间中?
  • @Stealth Rabbi - 是的,它是一个命名空间,请参阅这篇文章 How to: Import a Namespace into XAML 关于在 XAML 中导入 clr 命名空间
  • 另外,TextBlockBehavior 是否需要继承某些东西?
  • 不,它只是一个静态类
  • 我之前已经导入了一个命名空间,但是我必须将要导入的类放在命名空间/csproj 的根目录中,而不是出于某种原因在子目录中。看来我也必须为我的自定义 Behavior 类执行此操作。
猜你喜欢
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-17
  • 2011-01-28
相关资源
最近更新 更多