2017-02-15 34 views
2

我指的是代码块here,对数据触发为什么样式targettype必须重新绑定回原始属性?

<Window x:Class="WpfTutorialSamples.Styles.StyleDataTriggerSample" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="StyleDataTriggerSample" Height="200" Width="200"> 
    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"> 
     <CheckBox Name="cbSample" Content="Hello, world?" /> 
     <TextBlock HorizontalAlignment="Center" Margin="0,20,0,0" FontSize="48"> 
      <TextBlock.Style> 
       <Style TargetType="TextBlock"> 
        <Setter Property="Text" Value="No" /> 
        <Setter Property="Foreground" Value="Red" /> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding ElementName=cbSample, Path=IsChecked}" Value="True"> 
          <Setter Property="Text" Value="Yes!" /> 
          <Setter Property="Foreground" Value="Green" /> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </TextBlock.Style> 
     </TextBlock> 
    </StackPanel> 
</Window> 

对我来说,从编程语言设计点,线<Style TargetType="TextBlock">是完全没有必要的,因为它已经被嵌套在<TextBlock>里面,这样的当然,无论哪种设置属性都应该应用于TextBlock类型。那么为什么需要行<Style TargetType="TextBlock">

可以<Style TargetType>TextBlock之外的其他类型吗?

回答

1

那么为什么需要这条线呢?

甲样式可以被定义为一个资源,即不是内联,并且如果没有一个TargetType指定,XAML分析器应该如何能够解析它并设置由制定者指定的属性?它不能。或者至少它不。

仅仅因为你可以定义Style直列你仍然创​​造了可用于作为(全球)资源完全相同的类的实例,然后设置一个TargetType确实是必需的。

可以是除TextBlock以外的其他类型?

否,除了是从TextBlock派生的类型。如果指定另一种类型,则在分析BAML(编译的XAML)时,将在运行时获得异常。

2

你可以使用任何类TextBlock派生自(例如FrameworkElement)。

如果您实施自己的CustomizedTextBlock例如,您可以在项目中使用为TextBlock定义的样式。

你可以找到这个here的一个例子。

+0

*你可以使用任何类TextBlock派生自* ---什么? – Graviton

+1

'class CustomizedTextBlock:TextBlock'可以使用'Style'与'TargetType =“TextBlock”'(例如...)。而'TextBlock'本身则来自'FrameworkElement'。所以你可以为'TextBlock Style'使用'TargetType =“FrameworkElement”'。但我看不到为简单的“TextBlock”所做的努力...... – WPFGermany

相关问题