2009-01-13 20 views
5

He creado una aplicación de prueba muy simple para tratar de resolver este problema que me describió un compañero de trabajo. Pudo activarlo en C#, pero creo que necesitaba que la solución fuera más genérica y quería que se hiciera estrictamente en el XAML. El problema era: ¿cómo se activa el Storyboard dentro de un UserControl para que comience en respuesta a un evento en un control en la ventana que lo contiene (el padre no tiene que ser una ventana, puede ser una página u otro UserControl ... . Uso una ventana para simplificar). Entonces, mi mejor ejemplo es que tiene una Ventana con un Botón y una instancia de su UserControl. Desea que el evento Click del botón active un Storyboard dentro del UserControl para comenzar.Controlar el guion gráfico de UserControl desde la ventana principal en WPF usando solo XAML

Dentro del mismo UserControl, Storyboard se declara como un recurso con la clave de MyStoryboard. Creé un botón con un EventTrigger para mostrar que podía activar el guión gráfico haciendo referencia a él con una expresión de enlace. Aquí está el XAML completa para mi UserControl:

<UserControl x:Class="UserControlStoryboard.UserControl1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Height="300" Width="300"> 
<UserControl.Resources> 
    <Storyboard x:Key="MyStoryboard"> 
     <ColorAnimation Storyboard.TargetName="grid" Storyboard.TargetProperty="(Grid.Background).Color" From="CadetBlue" To="White" Duration="0:0:2" /> 
    </Storyboard> 
</UserControl.Resources> 
<Grid Background="CadetBlue" x:Name="grid"> 
    <Button Content="Press Me" Height="50"> 
     <Button.Triggers> 
      <EventTrigger RoutedEvent="Button.Click"> 
       <BeginStoryboard> 
        <BeginStoryboard.Storyboard> 
         <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type UserControl}}" Path="Resources[MyStoryboard]" /> 
        </BeginStoryboard.Storyboard> 
       </BeginStoryboard> 
      </EventTrigger> 
     </Button.Triggers> 
    </Button>    
</Grid> 

Tenía la esperanza de que, puesto que yo era capaz de contar una Storyboard para comenzar refiriéndose a ella con una expresión de enlace que debería ser capaz de hacer la exacta Lo mismo desde una ventana que contiene este UserControl como un elemento secundario. Pero parece que no puedo encontrar una referencia al Storyboard dentro de la Ventana principal. ¿Es esto imposible de lograr solo en XAML?

La ventana principal en mi proyecto de prueba no tiene más que un botón y una instancia de este UserControl. Si es posible, ¿qué elemento me permitiría agregar un EventTrigger donde el origen del evento es el botón y la acción de disparo le dice al Storyboard del UserControl que comience?

Gracias.

+0

Tengo una situación muy similar, lo hizo ¿alguna vez encuentras una resolución para esto? – Nate

+0

Lamentablemente, no. Esta pregunta fue hecha hace dos años. Desde entonces, he hecho cosas realmente extravagantes con enlaces de plantilla para comunicarme entre los controles padre e hijo. Ahora que tengo esta experiencia detrás de mí, en realidad estoy a favor del enfoque más directo de C#. Los trucos más sofisticados que veo hechos con xaml, bindings, viewmodels, etc. cuanto más me avergüenzo ... puedo hacer una gran pesadilla de depuración. – Rich

Respuesta

1

Puede acceder al guión gráfico utilizando StaticResource. Solo necesita asignar el recurso al Guión gráfico en el BeginStroyboard.

<BeginStoryboard Storyboard="{StaticResource MyStoryboard}"> 
</BeginStoryboard> 

Cambié el código a lo siguiente y cuando presiona el botón, se iniciará el guión gráfico para usted. Espero que esto ayude.

<UserControl.Resources> 
    <Storyboard x:Key="MyStoryboard"> 
     <ColorAnimation Storyboard.TargetName="grid" Storyboard.TargetProperty="(Grid.Background).Color" From="CadetBlue" To="White" Duration="0:0:2" /> 
    </Storyboard> 
</UserControl.Resources> 
<Grid Background="CadetBlue" x:Name="grid"> 
    <Button Content="Press Me" Height="50"> 
     <Button.Triggers> 
      <EventTrigger RoutedEvent="Button.Click"> 
       <BeginStoryboard Storyboard="{StaticResource MyStoryboard}"> 
       </BeginStoryboard> 
      </EventTrigger> 
     </Button.Triggers> 
    </Button> 
</Grid> 
0

Probablemente no sea una buena forma de hacerlo con Xaml puro.

Puede:

  • Hacer una propiedad de dependencia en su control de usuario que tiene un botón, a continuación, puede unirse a ella.
  • Crea un tipo de convertidor loco que atraviesa tu árbol visual buscando algo en particular.

Ambos requieren algunos C#, por lo que no sé si alguno de los anteriores es lo que está buscando.

2

Creo que la idea de responder a eventos externos dentro de UserControl no es muy segura. Dentro de UserControl, querrás reaccionar solo a los eventos que nacen dentro del control.

¿Puedes cambiar la situación y hacer lo siguiente:?

  • exponer la propiedad UC que necesita ser animada como una propiedad de dependencia (fondo en este caso)
  • Crear tanto EventTrigger y Storyboard en la ventana padre
+1

"Creo que la idea de responder a eventos externos dentro de UserControl no es muy segura". ¿Por qué? Este concepto se remonta a los controles ActiveX o a los documentos ActiveX que responden a las Propiedades ambientales en el contenedor de host. Claro, ahora estamos hablando de WPF, pero el concepto es el mismo, creo – MickyD

Cuestiones relacionadas