2010-03-03 10 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> 

Non viene compilato con errore 'Impossibile trovare il trigger target' backgroundBrush '.'WPF DataTrigger non trova Trigger Target

Se rimuovo il DataTrigger verrà compilato e funzionante. Se cambio il DataTrigger per usare TargetName="grid" Property="Background", esso compilerà e funzionerà (ma senza l'opacità desiderata).

Dove sto andando male?

+0

+1, buona domanda. Pensavo di aver capito WPF, ma non ho idea del perché questo non funziona ... – Heinzi

+0

(in ritardo, ma ancora ...) Stai cambiando il valore di un colore quando dovresti avere due colori diversi (definito come risorse locali) e poi scambiare tra di loro nei setter dei trigger. Penserei che questa sia la causa del problema (anche se dovrebbe essere testato per essere sicuro). – heltonbiker

risposta

4

Mentre non sono sicuro del motivo per cui il pennello non si trova nel namescope, è possibile farlo sostituendo il pennello e "punteggia" alla proprietà Color del pennello di sfondo nelle animazioni in questo modo:

<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

Ha funzionato - Grazie. backgroundBrush è effettivamente in ambito per l'innesco StoryBoard e funziona senza modifiche. Non riesco proprio a capire perché sarebbe fuori portata per il DataTrigger. – djskinner

+0

Sì, non riuscivo a capirlo neanche io. Penso che potrebbe essere che il TargetName della Storyboard è stato risolto in fase di esecuzione, mentre il TargetName del Setter è stato risolto in tempo di analisi XAML. –

+0

Il codice OP stava cambiando la proprietà del colore di un pennello denominato. Questo codice sta cambiando il pennello della proprietà di un elemento denominato. Immagino che questo è il motivo per cui questo codice funziona, e l'OP no. Una pratica migliore sarebbe dichiarare entrambi i pennelli come (diverse) risorse nel datatemplate e fare riferimento a loro nei setter. – heltonbiker

Problemi correlati