2014-10-30 63 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