Динамическая анимация с использованием раскадровок - PullRequest
5 голосов
/ 16 марта 2010

Я разрабатываю приложение в WPF, используя шаблон MVVM. Я показываю ориентированный граф с узлами и ссылками (см. Рисунок ниже).

http://free0.hiboox.com/images/1110/diapo1c36a4b95802846b8553d2fe9b9e6639.png?26

Пользователь может перетаскивать узлы из одной «ячейки» в другую. Когда пользователь удаляет узел, его положение изменяется, чтобы выровнять его в сетке. Я хочу анимировать узел, когда его положение корректируется во время процедуры выравнивания.

Узлы, ссылки и разделители - это все элементы, отображаемые в ItemsControl. Их представление контролируется некоторыми шаблонами данных, а их положение - стилями.

Что я делаю, так это:

private void Align() {
    // Computations...
    TX = ... //Target X is set
    TY = ... //target Y is set
    X = TX;
    Y = TY; // X and Y setters fire PropertyChanged
}

<Style x:Key="NodeViewStyle">
    <Setter Property="Canvas.Left" Value="{Binding X, Mode=TwoWay}"/>
    <Setter Property="Canvas.Top" Value="{Binding Y, Mode=TwoWay}"/>

Я хочу сделать следующее:

private void Align() {
    // Computations...
    TX = ...
    TY = ... //TX and TY setters fire PropertyChanged
}

<Style x:Key="NodeViewStyle">
    <Setter Property="Canvas.Left" Value="{Binding X, Mode=TwoWay}"/>
    <Setter Property="Canvas.Top" Value="{Binding Y, Mode=TwoWay}"/>
    <Style.Triggers>
        <DataTrigger Binding="{Binding State}" Value="UPDATEPOS">
            <DataTrigger.EnterActions>
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation To="{Binding TX}" Duration="0:0:1"
                                         Storyboard.TargetProperty="(Canvas.Left)"/>
                    </Storyboard>
                </BeginStoryboard>
            </DataTrigger.EnterActions>
        </DataTrigger>
    </Style.Triggers>

Но это не работает во время выполнения, так как я не могу привязать к свойству «To» моей DoubleAnimation (это Freezable).

Какой самый простой способ сделать такую ​​динамическую анимацию? Анимация свойства "X" через таймер прямо в модели представления?

1 Ответ

1 голос
/ 19 марта 2010

Я решил аналогичную проблему, анимируя вспомогательное (прикрепленное) свойство от 0 до 1, а затем связывая требуемое целевое свойство со вспомогательным с помощью преобразователя значений. Имеет ли это смысл?

...