2009-04-28 9 views
7

Tengo varios guiones gráficos que acceden a la misma propiedad (no al mismo tiempo). Después de que un guión gráfico cambió la propiedad, el otro parece no tener acceso a él y no cambia nada ... ¿Qué puedo hacer contra esto?Varios guiones gráficos en una propiedad

muestra:

<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> 

Este es el código de muestra más pequeño que podría hacer. Una vez que haya suspendido un elemento, no se volverá azul cuando lo seleccione (intente hacer clic en un elemento y luego use las teclas de flecha para seleccionar elementos sin colocarlos).

+0

¿Qué quiere exactamente decir con "el otro parece no tener acceso y no cambia nada"? ¿Recibes un mensaje de error? Comportamiento inesperado específico? –

+0

Para ser más específico, tengo un ListBox. En ItemContainerStyle, defino una plantilla para todos ListBoxItems. Aquí desencadenaré IsMouseOver y IsSelected y definiré un Storyboard para un efecto de fundido de entrada/salida. Cuando el elemento está suspendido, el fondo debe ponerse naranja, y cuando se selecciona debe ponerse azul. Puedo colocar un elemento en el mismo lugar tantas veces como quiera, funciona. Pero si lo selecciono y lo vuelvo a seleccionar, el efecto de desplazamiento no funciona más. Si uso diferentes propiedades, todavía funciona. – eWolf

+0

Parece ser algo con el orden de los factores desencadenantes. Si coloco el disparador IsSelected delante del disparador IsMouseOver (que, dicho sea de paso, es un MultiTrigger y no se genera cuando el elemento se selecciona), es al revés: el efecto IsSelected no funciona después de que el elemento se suspendió una vez. – eWolf

Respuesta

12

¡Tengo una solución! El orden de los desencadenantes y las acciones sí importa ... la respuesta es no jugar más de un guión gráfico al mismo tiempo, simplemente detener el otro.

<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. Mucho tiempo desde que publiqué esta pregunta ...;) ¡Qué bien que finalmente puedas descubrirlo! – eWolf

1

que he sido capaz de reproducir sus resultados erróneos usando el siguiente código (estoy confundido también):

<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> 

Este código es un poco más fácil de leer, ya que los efectos visuales, recursos y desencadenantes se declaran por separado. Tal vez podría intentar utilizar EventTriggers para lograr su objetivo (utilizando los eventos enrutados "ListBoxItem.MouseEnter" y "ListBoxItem.MouseLeave"). ¡Buena suerte!

+0

Sé que acabo de crear los controles que deseo modificar dos veces (esto fue posible en mi caso, acabo de publicar un ejemplo simplificado). Rápido + sucio ... – eWolf

Cuestiones relacionadas