2014-10-30 72 views
0

我想为DataTemplate中的控件设置Triggers。每当我在DataTemplate中设置控件的属性时,它似乎不起作用。但是,如果不在DataTemplate中设置TextBlock内的属性,那么我可以在样式中看到Trigger的效果(它有效)。我不知道使用样式触发器与DataTemplate是否好! XAML在下面;用于DataTemplates的WPF样式触发器

<Grid> 
    <Grid.Resources> 
     <Style TargetType="TextBlock" x:Key="BlockOf"> 
      <Style.Triggers> 
       <Trigger Property="IsMouseOver" Value="True"> 
        <Setter Property="FontWeight" Value="ExtraBold" /> 
        <Setter Property="FontSize" Value="22" /> 
       </Trigger> 
     </Style.Triggers> 
    </Style> 
</Grid.Resources> 

...........

DataTemplate中的按钮,

<Button.ContentTemplate> 
    <DataTemplate DataType="Button"> 
     <TextBlock Style="{DynamicResource BlockOf}" Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content}" 
FontStyle="Italic" FontSize="9"/> 
    </DataTemplate> 
</Button.ContentTemplate> 

回答

1

我可以在这里看到两个问题。首先是目前的触发器只能在ButtonTextBlock内工作,而不是整个的Button。您可以使用DataTriggerRelativeSource进行更改。第二个问题是,即使当鼠标结束时TextBlockStyle.Trigger无法覆盖您对TextBlock设置的本地值,因此您需要将默认值Setter带入您的Style。检查Dependency Property Setting Precedence List

<Style TargetType="TextBlock" x:Key="BlockOf"> 
    <Setter Property="FontStyle" Value="Italic"/> 
    <Setter Property="FontSize" Value="9"/> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Button}}, Path=IsMouseOver}" Value="True"> 
      <Setter Property="FontWeight" Value="ExtraBold" /> 
      <Setter Property="FontSize" Value="22" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

然后TextBlock简单

<TextBlock Style="{DynamicResource BlockOf}" Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content}" /> 
+0

“第一个是当前的触发将只能用于TextBlock的内扣,不超过整个按钮”,这就是我想要的。我只想在按钮中使用IsMouseOver作为TextBlock。但是,对于第二个问题,我认为你是对的。所以为了使用样式触发器,我应该避免使用局部值,并通过样式设置器为前者设置它们,对吧? – Deniz 2014-10-30 17:17:41

+0

对不起,我只是假设它是错的。如果这是期望的行为,那么你的触发器就好,只是不要设置本地值 – dkozl 2014-10-30 17:19:09