2010-02-11 106 views
3

我有两个类型的文本必须遵循基于枚举类似的着色规则:使用单一样式设置超链接和TextBlock的样式?

public enum Modes 
{ 
    A, 
    B, 
    C 
} 

DataTrigger标记样式是用来上色:

 <Style TargetType="SEE BELOW" x:Key="Coloring"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Path=.}" Value="A"> 
        <Setter Property="Foreground" Value="Red" /> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding Path=.}" Value="B"> 
        <Setter Property="Foreground" Value="Green" /> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding Path=.}" Value="C"> 
        <Setter Property="Foreground" Value="Blue" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 

一个使用场景是System.Windows.Documents.Hyperlink嵌套0​​:

<Hyperlink><TextBlock/></Hyperlink> 

而另一个只是一个简单的TextBlock

<TextBlock Style="{StaticResource Coloring}" Text="yada"/> 

我当然可以,风格既TextBlock元素:

<TextBlock Style="{StaticResource Coloring}" Text="yada"/> 
<Hyperlink><TextBlock Style="{StaticResource Coloring}"/></Hyperlink> 

但未能样式的超链接案件的下划线。

如果我尝试风格跨越两种类型:

<TextBlock Style="{StaticResource Coloring}" Text="yada"/> 
<Hyperlink Style="{StaticResource Coloring}"><TextBlock/></Hyperlink> 

然后造型失败,因为有(显然)在风格的TargetType属性使用没有共同的祖先类型。

因为这最终是一个可配置的东西,目标是有一个XAML文档定义这些文本块的颜色映射模式。因此,我不愿意为定义相同映射的两种冗余样式(一种用于超链接,一种用于TextBlock)。

所以......问题:如何在没有多余Style XAML块的情况下始终如一地对两种情况进行样式设计?

回答

6

您可以通过这种风格本身内结合他们,这样迫使超链接具有相同的前景色作为其父的TextBlocks:

<Style TargetType="TextBlock" x:Key="Coloring"> 
     <Style.Resources> 
      <Style TargetType="Hyperlink"> 
       <Setter Property="Foreground" Value="{Binding Foreground,RelativeSource={RelativeSource FindAncestor,AncestorType=TextBlock}}"/> 
      </Style> 
     </Style.Resources> 
      <Setter Property="Foreground" Value="Orange"/> 
     <Style.Triggers> 
     <DataTrigger Binding="{Binding Path=.}" Value="A"> 
      <Setter Property="Foreground" Value="Red" /> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding Path=.}" Value="B"> 
      <Setter Property="Foreground" Value="Green" /> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding Path=.}" Value="C"> 
      <Setter Property="Foreground" Value="Blue" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

在这个例子中,我添加了一个二传手,使默认前景橙色,仅用于测试目的。

+0

谢谢。很多方式来完成WPF中的事情。我认为我现在有足够的能力前进。 – el2iot2 2010-02-11 22:10:34

0

张贴后,我意识到另一种方法。我正在强制嵌套TextBlock场景的超链接。如果我要将超链接包装在TextBlock中:

<TextBlock Style="{StaticResource Coloring}"><Hyperlink><TextBlock/></HyperLink></TextBlock> 

然后我的情况都崩溃为TextBlock样式。 (结合上面的解决方案)