2010-03-03 3 views
5
<ListBox.ItemTemplate> 
    <DataTemplate> 
     <Grid x:Name="grid"> 
      <Grid.Background> 
       <SolidColorBrush x:Name="backgroundBrush" Color="Transparent" Opacity="0.1"/> 
      </Grid.Background> 
     </Grid> 
     <DataTemplate.Triggers> 
      <DataTrigger Binding="{Binding IsExpanded}" Value="True"> 
       <Setter TargetName="backgroundBrush" Property="Color" Value="Green" /> 
      </DataTrigger> 
      <Trigger SourceName="grid" Property="IsMouseOver" Value="True"> 
       <Trigger.EnterActions> 
        <BeginStoryboard> 
         <Storyboard> 
          <ColorAnimation Storyboard.TargetName="backgroundBrush" 
           Storyboard.TargetProperty="Color" 
           To="White" Duration="0:0:1.5"/> 
         </Storyboard> 
        </BeginStoryboard> 
       </Trigger.EnterActions> 
       <Trigger.ExitActions> 
        <BeginStoryboard> 
         <Storyboard> 
          <ColorAnimation Storyboard.TargetName="backgroundBrush" 
           Storyboard.TargetProperty="Color" 
           AccelerationRatio="1" Duration="0:0:1.5" /> 
         </Storyboard> 
        </BeginStoryboard> 
       </Trigger.ExitActions> 
      </Trigger> 
     </DataTemplate.Triggers> 
    </DataTemplate> 
</ListBox.ItemTemplate> 

Не компилируется с ошибкой «Невозможно найти триггерную цель» backgroundBrush '.'WPF DataTrigger не найден Trigger Target

Если я удалю DataTrigger, он скомпилируется и работает. Если я изменил DataTrigger на использование TargetName="grid" Property="Background", он будет компилироваться и работать (но без желаемой непрозрачности).

Куда я иду не так?

+0

+1, хороший вопрос. Я думал, что понял WPF, но я не знаю, почему это не работает ... – Heinzi

+0

(поздний комментарий, но все же ...) Вы меняете значение цвета, когда на самом деле у вас должно быть два разных цвета (определенные как локальные ресурсы), а затем поменяйте их между собой в установщиках триггеров. Я думаю, что это причина проблемы (хотя ее нужно проверить, чтобы точно знать). – heltonbiker

ответ

4

Хотя я не уверен, почему кисть не указана в обозревателе, вы можете сделать это, заменив кисть и «усеянный» на свойство «Цвет» кисти фона в анимации следующим образом:

<ListBox.ItemTemplate> 
    <DataTemplate> 
     <Grid x:Name="grid"> 
      <Grid.Background> 
       <SolidColorBrush Color="Transparent" Opacity="0.1"/> 
      </Grid.Background> 
     </Grid> 
     <DataTemplate.Triggers> 
      <DataTrigger Binding="{Binding IsExpanded}" Value="True"> 
       <Setter TargetName="grid" Property="Background"> 
        <Setter.Value> 
         <SolidColorBrush Color="Green" Opacity="0.1"/> 
        </Setter.Value> 
       </Setter> 
      </DataTrigger> 
      <Trigger SourceName="grid" Property="IsMouseOver" Value="True"> 
       <Trigger.EnterActions> 
        <BeginStoryboard> 
         <Storyboard> 
          <ColorAnimation Storyboard.TargetName="grid" 
          Storyboard.TargetProperty="Background.Color" 
          To="White" Duration="0:0:1.5"/> 
         </Storyboard> 
        </BeginStoryboard> 
       </Trigger.EnterActions> 
       <Trigger.ExitActions> 
        <BeginStoryboard> 
         <Storyboard> 
          <ColorAnimation Storyboard.TargetName="grid" 
          Storyboard.TargetProperty="Background.Color" 
          AccelerationRatio="1" Duration="0:0:1.5" /> 
         </Storyboard> 
        </BeginStoryboard> 
       </Trigger.ExitActions> 
      </Trigger> 
     </DataTemplate.Triggers> 
    </DataTemplate> 
</ListBox.ItemTemplate> 
+0

Это сработало - Спасибо. backgroundBrush фактически находится в области триггера StoryBoard и работает без изменений. Я просто не понимаю, почему это было бы недоступно для DataTrigger. – djskinner

+0

Да, я тоже не мог понять. Я думаю, что может быть, что TargetName раскадровки разрешено во время выполнения, тогда как TargetTame Setter разрешается во время разбора XAML. –

+0

Код OP изменил свойство цвета именованной кисти. Этот код изменяет кисть свойства именованного элемента. Я думаю, именно поэтому этот код работает, а OP нет. Лучшей практикой было бы объявить обе кисти как (разные) ресурсы в datatemplate и ссылаться на них в сеттерах. – heltonbiker