2010-03-16 4 views
5

Я разрабатываю приложение в WPF с использованием шаблона MVVM. Я показываю ориентированный граф с узлами и ссылками (см. Следующий рисунок).Динамическая анимация с использованием раскадровки

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

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

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

Что я делаю следующее:

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> 

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

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

+2

Вы нашли решение, подобное MVVM? Было бы здорово, если бы вы могли опубликовать небольшой фрагмент вашего кода xaml (более конкретно, проблему «связывания») вашего решения. Спасибо – Peanut

ответ

1

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

+1

Это действительно имеет смысл. Это обычное обходное решение для некоторых довольно не похожих вопросов, так как эта проблема не очень часто встречается в google или stackoverflow :) Но, как большой поклонник MVVM, я разочарован, увидев, что я решил проблему намного легче без рисунка. Слишком много накладных расходов слишком велико. Надеюсь, что такое поведение будет проще с будущими изменениями в каркасе, как это было сделано с InputGesture без привязки к Freezable и не принимать команд. Freezables классные, но не всегда. –

Смежные вопросы