Tenemos una animación simple que se ejecuta cuando un ToggleButton está activada y desactivada (se expande un ListView a la altura y, a continuación, se derrumba un ListView altura). ¿Cómo encender la EventTrigger (o Animación) para la <Storyboard x:Key="CommentsCollapse"> cuando el DataContext de Unión de los cambios en la x:Name="DetailsGrid" Cuadrícula en el siguiente XAML?

En otras palabras, siempre que la Unión de los cambios para el «DetailsGrid», queremos que la «CommentsCollapse» StoryBoard para ser activados para garantizar el control se devuelve a su estado de colapso.

<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="800"
Height="400">
<Page.Resources>
<Storyboard x:Key="CommentsExpand">
<DoubleAnimationUsingKeyFrames
BeginTime="00:00:00"
Storyboard.TargetName="CommentsListView"
Storyboard.TargetProperty="(FrameworkElement.Height)">
<SplineDoubleKeyFrame KeyTime="00:00:00.200" Value="300"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Key="CommentsCollapse">
<DoubleAnimationUsingKeyFrames
BeginTime="00:00:00"
Storyboard.TargetName="CommentsListView"
Storyboard.TargetProperty="(FrameworkElement.Height)">
<SplineDoubleKeyFrame KeyTime="00:00:00.200" Value="75"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</Page.Resources>
<Page.Triggers>
<EventTrigger RoutedEvent="ToggleButton.Checked" SourceName="CommentsToggleButton">
<BeginStoryboard Storyboard="{StaticResource CommentsExpand}"/>
</EventTrigger>
<EventTrigger RoutedEvent="ToggleButton.Unchecked" SourceName="CommentsToggleButton">
<BeginStoryboard Storyboard="{StaticResource CommentsCollapse}"/>
</EventTrigger>
</Page.Triggers>
<Grid DataContext="{Binding Path=CurrentTask.Workflow.Invoice}" x:Name="DetailsGrid">
<StackPanel Orientation="Horizontal">
<Canvas Width="428">
<GroupBox Width="422" Margin="5,0,0,0">
<GroupBox.Header>
<StackPanel Orientation="Horizontal">
<ToggleButton
x:Name="CommentsToggleButton"
Width="20"
Height="10"
Margin="5,0,0,0">
<ToggleButton.Content>
<Rectangle
Width="5"
Height="5"
Fill="Red"/>
</ToggleButton.Content>
</ToggleButton>
<TextBlock Foreground="Blue" Text="Comments"/>
</StackPanel>
</GroupBox.Header>
<ListView
x:Name="CommentsListView"
Height="75"
ItemsSource="{Binding Path=Comments}">
<ListView.View>
<GridView>
<GridViewColumn DisplayMemberBinding="{Binding Path=Date}" Header="Date"/>
<GridViewColumn DisplayMemberBinding="{Binding Path=Name}" Header="User"/>
<GridViewColumn DisplayMemberBinding="{Binding Path=Description}" Header="Comment"/>
</GridView>
</ListView.View>
</ListView>
</GroupBox>
</Canvas>
</StackPanel>
</Grid>
</Page>
InformationsquelleAutor Metro Smurf | 2009-11-19

3 Comentarios

  1. 5

    Yo lo encuentro demasiado que esto no es posible en XAML. Usted necesita la DataContextChanged evento, que no es un RoutedEvent y por lo tanto no puede ser utilizado en un EventTrigger.

    Esto parece funcionar, aunque:

    <Window x:Class="DatacontextChangedSpike.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Window.Resources>
    <Storyboard x:Key="ListViewExpands" AutoReverse="True" RepeatBehavior="2x">
    <DoubleAnimation Storyboard.TargetName="PulsingListView" Storyboard.TargetProperty="Height"
    From="10" To="60"/>
    </Storyboard>
    </Window.Resources>
    <StackPanel>
    <ListView Name="PulsingListView" BorderThickness="2" BorderBrush="Black"
    DataContextChanged="PulsingListView_DataContextChanged">
    <TextBlock>Listview</TextBlock>
    </ListView>
    <Button Click="Button_Click" >Change DataContext</Button>
    </StackPanel>
    </Window>
    using System;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Media.Animation;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    namespace DatacontextChangedSpike
    {
    public partial class Window1 : Window
    {
    public Window1()
    {
    DataContext = new List<string>();
    InitializeComponent();
    }
    private void Button_Click(object sender, RoutedEventArgs e)
    {
    DataContext = new List<int>();
    }
    private void PulsingListView_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
    var sb = (Storyboard)FindResource("ListViewExpands");
    sb.Begin();
    }
    }
    }
    • habíamos intentado esto, en principio, pero era la esperanza que hay en un puro XAML soltution. Gracias.
  2. 1

    Puede desencadenar el Guión de una DataTrigger(EnterAction y ExitAction), si se puede establecer una Perspective de la propiedad a true o false cuando cambie el DataContext. Así que el DataTrigger se basa en su nueva Bool propiedad.

    • inicialmente hicimos algo similar, re: el uso de la ViewModel para manejar el gatillo, pero en definitiva ha ido de la ruta de la utilización de la DataContextChanged evento como sugiere Dabblernl como se mantiene la lógica de interfaz de usuario en la interfaz de usuario y de la modelo.
  3. 0

    No creo que usted puede hacer esto a través de la pura Xaml, vas a tener que hacer esto en el código (o mejor aún, escribir una Expresión generalizada de Comportamiento, de modo que usted puede describir en Xaml). Retirar el PropertyMetadata de su Dependencia de la Propiedad para ver cómo usted puede conectar su evento de Propiedad Cambiado.

    • ¿tiene los recursos (enlaces) que se podría señalar mí para que me apunte en la dirección correcta?

Dejar respuesta

Please enter your comment!
Please enter your name here