У меня проблемы с анимацией преобразования рендера объекта Canvas с использованием триггера данных.В качестве тестового примера у меня есть эллипс на холсте и две кнопки.Когда я нажимаю каждую кнопку, я хочу, чтобы положение эллипса анимировалось по координате X этой кнопки:
![enter image description here](https://i.stack.imgur.com/rhM30.png)
Тот факт, что я использую кнопки вэтот конкретный пример ни здесь, ни там, дело в том, что я пытаюсь вызвать эти анимации с помощью DataTrigger, привязанного к свойству в моей модели представления:
// this is the property my DataTrigger will bind to
private string _Anim;
public string Anim
{
get { return this._Anim; }
set
{
this._Anim = value;
RaisePropertyChanged(() => this.Anim);
}
}
// a command handler for the buttons that sets my animation property
public ICommand AnimCommand { get { return new RelayCommand<string>(OnAnim); } }
private void OnAnim(string value)
{
this.Anim = String.Empty; // cancel any existing animation, probably not needed...
this.Anim = value;
}
Вот Xaml, который я используюсделать это.По сути, это просто холст, содержащий эллипс и две кнопки, а эллипс имеет 2 раскадровки, которые запускаются в ответ на задание для свойства backend различных строк (т. Е. «Left» и «Right»):
<Viewbox xmlns:sys="clr-namespace:System;assembly=mscorlib">
<Canvas Width="350" Height="150" Background="CornflowerBlue">
<Ellipse x:Name="MyEllipse" Width="20" Height="20" Fill="Red">
<Ellipse.RenderTransform>
<TranslateTransform x:Name="myTransform" X="50" Y="50" />
</Ellipse.RenderTransform>
<Ellipse.Style>
<Style TargetType="Ellipse">
<Style.Triggers>
<DataTrigger Binding="{Binding Anim}" Value="Left">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="(Ellipse.RenderTransform).(TranslateTransform.X)" To="100" Duration="0:0:1" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
<DataTrigger Binding="{Binding Anim}" Value="Right">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="(Ellipse.RenderTransform).(TranslateTransform.X)" To="200" Duration="0:0:1" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Ellipse.Style>
</Ellipse>
<Button x:Name="btnLeft" Content="Left" Command="{Binding AnimCommand}" CommandParameter="Left" Canvas.Left="100" Canvas.Top="100" Width="32" Height="24" />
<Button x:Name="btnRight" Content="Right" Command="{Binding AnimCommand}" CommandParameter="Right" Canvas.Left="200" Canvas.Top="100" Width="32" Height="24" />
</Canvas>
</Viewbox>
Когда я запускаю это, я могу нажать на первую анимацию, а затем на вторую, и поведение будет правильным оба раза.Однако нажатие на них в обратном порядке не работает ... кнопка "вправо" анимируется правильно, а кнопка "влево" ничего не делает.Это как если бы «правильная» анимация все еще работала или блокировала свойство или что-то еще, случай еще более подкреплялся тем, что ситуация изменилась, если я поменяю местами порядок объявлений раскадровки в Xaml.
Это отлично работает с EventTriggers, я вижу это только с DataTriggers.Я также пытался играть с FillBehaviours и HandoffBehaviors, но безрезультатно.Может кто-нибудь объяснить, почему это происходит и как это исправить?