2009-04-28 8 views
7

J'ai plusieurs storyboards qui accèdent à la même propriété (pas en même temps). Après qu'un storyboard a changé la propriété, l'autre semble n'y avoir accès et ne change rien. Que puis-je faire contre cela?Plusieurs storyboards sur une seule propriété

Exemple:

<ListBox> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="ListBoxItem"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
         <Border Name="Border" BorderBrush="DarkGray" BorderThickness="1" Margin="3"> 
          <ContentPresenter /> 
          <Border.Background> 
           <SolidColorBrush /> 
          </Border.Background> 
         </Border> 
         <ControlTemplate.Triggers> 
          <Trigger Property="IsSelected" Value="True"> 
           <Trigger.EnterActions> 
            <BeginStoryboard> 
             <Storyboard> 
              <ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="Background.Color" To="#3e8bff" Duration="0:0:0.1" /> 
             </Storyboard> 
            </BeginStoryboard> 
           </Trigger.EnterActions> 
           <Trigger.ExitActions> 
            <BeginStoryboard> 
             <Storyboard> 
              <ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="Background.Color" To="White" Duration="0:0:0.1" /> 
             </Storyboard> 
            </BeginStoryboard> 
           </Trigger.ExitActions> 
          </Trigger> 
          <MultiTrigger> 
           <MultiTrigger.Conditions> 
            <Condition Property="IsMouseOver" Value="True" /> 
            <Condition Property="IsSelected" Value="False" /> 
           </MultiTrigger.Conditions> 
           <MultiTrigger.EnterActions> 
            <BeginStoryboard> 
             <Storyboard> 
              <ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="Background.Color" To="Orange" Duration="0:0:0.1" /> 
             </Storyboard> 
            </BeginStoryboard> 
           </MultiTrigger.EnterActions> 
           <MultiTrigger.ExitActions> 
            <BeginStoryboard> 
             <Storyboard> 
              <ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="Background.Color" To="White" Duration="0:0:0.1" /> 
             </Storyboard> 
            </BeginStoryboard> 
           </MultiTrigger.ExitActions> 
          </MultiTrigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </ListBox.ItemContainerStyle> 
    <ListBox.Items> 
     <sys:String>hey</sys:String> 
     <sys:String>du</sys:String> 
     <sys:String>dux</sys:String> 
     <sys:String>duy</sys:String> 
     <sys:String>dua</sys:String> 
    </ListBox.Items> 
</ListBox> 

C'est le plus petit exemple de code que je pourrais faire. Après avoir survolé un élément, il ne devient pas bleu lorsqu'il est sélectionné (essayez de cliquer sur un élément, puis utilisez les touches fléchées pour sélectionner les éléments sans les déplacer).

+0

Que voulez-vous dire par "l'autre ne semble pas y avoir accès et ne change rien"? Avez-vous un message d'erreur? Comportement inattendu spécifique? –

+0

Pour être plus précis, j'ai un ListBox. Dans ItemContainerStyle, je définis un modèle pour tous les ListBoxItems. Ici, je déclenche IsMouseOver et IsSelected et je définis un Storyboard pour un effet de fondu entrant/sortant. Lorsque l'élément est survolé, l'arrière-plan doit devenir orange et lorsqu'il est sélectionné, il doit devenir bleu. Je peux planer un objet autant de fois que je veux, ça marche. Mais si je le sélectionne et le désélectionne à nouveau, l'effet de survol ne fonctionne plus. Si j'utilise des propriétés différentes, cela fonctionne toujours. – eWolf

+0

Cela semble être quelque chose avec l'ordre des déclencheurs. Si je mets le trigger IsSelected devant le trigger IsMouseOver (qui, soit dit en passant, est un MultiTrigger et n'est pas déclenché quand l'item IsSelected), c'est l'inverse: L'effet IsSelected ne fonctionne pas après le survol de l'item une fois que. – eWolf

Répondre

12

J'ai une solution !!! L'ordre des déclencheurs et des actions est important ... la réponse n'est pas de jouer plus d'un storyboard en même temps, mais d'en arrêter d'autres.

<ControlTemplate.Triggers> 
    <MultiTrigger> 
      <MultiTrigger.Conditions> 
       <Condition Property="IsMouseOver" Value="True"/> 
       <Condition Property="Selector.IsSelected" Value="False" /> 
      </MultiTrigger.Conditions> 
      <MultiTrigger.EnterActions> 
       <StopStoryboard BeginStoryboardName="SelectedBegin" /> 
       <StopStoryboard BeginStoryboardName="UnselectBegin" /> 
       <BeginStoryboard x:Name="EnterBegin" Storyboard="{StaticResource MouseEnterSb}"/> 
      </MultiTrigger.EnterActions> 
      <MultiTrigger.ExitActions> 
       <BeginStoryboard x:Name="LeaveBegin" Storyboard="{StaticResource MouseLeaveSb}"/> 
      </MultiTrigger.ExitActions> 
     </MultiTrigger> 
     <Trigger Property="Selector.IsSelected" Value="True"> 
    <Trigger.EnterActions> 
       <StopStoryboard BeginStoryboardName="LeaveBegin" /> 
       <StopStoryboard BeginStoryboardName="EnterBegin" /> 
       <BeginStoryboard x:Name="SelectedBegin" Storyboard="{StaticResource SelectedSb}"/> 
    </Trigger.EnterActions> 
    <Trigger.ExitActions> 
       <BeginStoryboard x:Name="UnselectBegin" Storyboard="{StaticResource UnselectSb}"/> 
    </Trigger.ExitActions> 
    </Trigger> 
</ControlTemplate.Triggers> 
+0

Wow. Assez longtemps depuis que j'ai posté cette question ..;) Cool que vous pourriez comprendre finalement! – eWolf

1

Je suis en mesure de reproduire vos résultats erronés en utilisant le code suivant (je suis perplexe aussi):

<ListBox> 
<ListBox.ItemContainerStyle> 
    <Style TargetType="ListBoxItem"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
        <ControlTemplate.Resources> 
         <Storyboard x:Key="BorderAnimationToRed"> 
          <ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="Background.Color" To="Red" Duration="0:0:0.1" /> 
         </Storyboard> 
         <Storyboard x:Key="BorderAnimationToBlue"> 
          <ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="Background.Color" To="Blue" Duration="0:0:0.1" /> 
         </Storyboard> 
         <Storyboard x:Key="BorderAnimationToOrange"> 
          <ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="Background.Color" To="Orange" Duration="0:0:0.1" /> 
         </Storyboard> 
         <Storyboard x:Key="BorderAnimationToWhite"> 
          <ColorAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="Background.Color" To="White" Duration="0:0:0.1" /> 
         </Storyboard> 
        </ControlTemplate.Resources> 
        <Border Name="Border" BorderBrush="DarkGray" BorderThickness="1" Margin="3"> 
         <ContentPresenter /> 
         <Border.Background> 
          <SolidColorBrush /> 
         </Border.Background> 
        </Border> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsMouseOver" Value="True"> 
          <Trigger.EnterActions> 
           <BeginStoryboard Storyboard="{StaticResource BorderAnimationToOrange}"/> 
          </Trigger.EnterActions> 
          <Trigger.ExitActions> 
           <BeginStoryboard Storyboard="{StaticResource BorderAnimationToWhite}"/> 
          </Trigger.ExitActions> 
         </Trigger> 
         <Trigger Property="IsSelected" Value="True"> 
          <Trigger.EnterActions> 
           <BeginStoryboard Storyboard="{StaticResource BorderAnimationToBlue}"/> 
          </Trigger.EnterActions> 
          <Trigger.ExitActions> 
           <BeginStoryboard Storyboard="{StaticResource BorderAnimationToWhite}"/> 
          </Trigger.ExitActions> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</ListBox.ItemContainerStyle> 
<ListBox.Items> 
    <sys:String>hey</sys:String> 
    <sys:String>du</sys:String> 
    <sys:String>dux</sys:String> 
    <sys:String>duy</sys:String> 
    <sys:String>dua</sys:String> 
</ListBox.Items> 

Ce code est un peu plus facile à lire, comme les visuels, ressources et les déclencheurs sont déclarés séparément. Peut-être que vous pourriez essayer d'utiliser EventTriggers pour atteindre votre objectif (en utilisant les événements routés "ListBoxItem.MouseEnter" et "ListBoxItem.MouseLeave"). Bonne chance!

+0

Je sais que je viens de créer les contrôles que je veux modifier deux fois (c'était possible dans mon cas, je viens de poster un exemple simplifié). Rapide + sale .. – eWolf