2014-10-30 3 views
0

Я хотел бы установить триггеры для элементов управления в DataTemplate. Всякий раз, когда я устанавливаю свойство элемента управления в пределах DataTemplate, он кажется не работает. Однако, если не задано свойство в пределах TextBlock внутри DataTemplate, тогда я могу увидеть эффект Trigger в стиле (он работает). Я не уверен, что использование стильных триггеров с DataTemplate - это хорошо или нет! XAML находится ниже;Триггеры стиля WPF для DataTemplates

<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

Я вижу две проблемы здесь. Первый заключается в том, что текущий триггер будет работать только для TextBlock внутри Button, а не по всему Button. Вы можете изменить это, используя DataTrigger с привязкой RelativeSource. Вторая проблема заключается в том, что даже когда мышь больше 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 внутри кнопки. Однако для второй проблемы я считаю, что вы правы. Поэтому, чтобы работать со стильными триггерами, я должен избегать локальных значений и устанавливать их через Style Setters, например, правильно? – Deniz

+0

Извините, я просто предположил, что это неправильно. Если это желаемое поведение, то ваш триггер в порядке, просто не устанавливайте локальные значения – dkozl

Смежные вопросы