WPF - Непонятное поведение DataTrigger / DoubleAnimation - PullRequest
0 голосов
/ 12 марта 2009

Я пытаюсь анимировать свойство ScaleY LayoutTransform на основе DataTrigger, привязанного к логическому значению в моем ViewModel классе. Анимация происходит, когда значение DataTrigger (когда приложение запускается впервые) впервые воспринимается как ложное, и когда я впервые изменяю его значение на true в событии checkbox, но не когда я устанавливаю его на false в том же флажке событие.

Упрощенная версия того, что я делаю, приведена ниже.

Класс ViewModel очень прост и содержит один логический DependencyProperty с именем Selected.

    public class VM : DependencyObject
{
    public bool Selected
    {
        get { return (bool)GetValue(SelectedProperty); }
        set { SetValue(SelectedProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Selected.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty SelectedProperty =
        DependencyProperty.Register("Selected", typeof(bool), typeof(VM), new UIPropertyMetadata(false));
}

Window.xaml содержит кнопку и флажок. Когда флажок установлен, я устанавливаю для свойства ViewModel 'Selected' значение true и false, когда оно не отмечено. Вот код как для xaml, так и для кода.

<Window x:Class="DataTriggers.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:y="clr-namespace:DataTriggers"
Title="Window1" Height="300" Width="300">
<Window.Resources>
    <y:VM x:Key="VM"/>

    <Style TargetType="Button" x:Key="but">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Selected}" Value="False">
                <DataTrigger.EnterActions>
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation Duration="0:0:1"
                                             To="0"
                                             Storyboard.TargetProperty="(LayoutTransform).(ScaleTransform.ScaleY)"/>
                        </Storyboard>
                    </BeginStoryboard>
                </DataTrigger.EnterActions>
            </DataTrigger>
            <DataTrigger Binding="{Binding Selected}" Value="True">
                <DataTrigger.EnterActions>
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation Duration="0:0:1"
                                             To="1"
                                             Storyboard.TargetProperty="(LayoutTransform).(ScaleTransform.ScaleY)"/>
                        </Storyboard>
                    </BeginStoryboard>
                </DataTrigger.EnterActions>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>
<StackPanel>

            <Button Style="{StaticResource but}" DataContext="{StaticResource VM}">
        <Button.LayoutTransform>
            <ScaleTransform></ScaleTransform>
        </Button.LayoutTransform>
            me
            </Button>
    <CheckBox Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked"/>
</StackPanel>

    public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
    }

    private void CheckBox_Checked(object sender, RoutedEventArgs e)
    {

        VM vm = this.FindResource("VM") as VM;
        vm.Selected = true;
    }

    private void CheckBox_Unchecked(object sender, RoutedEventArgs e)
    {
        VM vm = this.FindResource("VM") as VM;
        vm.Selected = false;
    }
}

Я знаю, что DataTrigger срабатывает, когда свойство имеет значение false, потому что если я изменю DoubleAnimation на простой Setter, работающий со свойством Opacity, тогда я увижу правильные результаты. Так что, похоже, проблема в том, как я использую DoubleAnimation.

Любая помощь будет оценена.

1 Ответ

3 голосов
/ 12 марта 2009

Это поведение ODD, но я решил рефакторировать «Ложный» случай в ExitActions DataTrigger следующим образом -

<DataTrigger Binding="{Binding Selected}" Value="True">
                <DataTrigger.EnterActions>
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation Duration="0:0:1"
                                             To="1"
                                             Storyboard.TargetProperty="(RenderTransform).(ScaleTransform.ScaleY)"/>
                        </Storyboard>
                    </BeginStoryboard>
                </DataTrigger.EnterActions>
                <DataTrigger.ExitActions>
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation Duration="0:0:1"
                                             To="0"
                                             Storyboard.TargetProperty="(RenderTransform).(ScaleTransform.ScaleY)"/>
                        </Storyboard>
                    </BeginStoryboard>
                </DataTrigger.ExitActions>
            </DataTrigger>

Это работает как задумано. Я не знаю, в чем разница между этими двумя случаями, но, по крайней мере, это ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...