Я не уверен в лучшем обходном пути, но проблема в том, что триггерам все равно нужно будет «отменить» свои анимированные значения, когда триггер больше не действует. Так что в вашем случае первый триггер может быть применен, но он эффективно удаляется с помощью ExitAction последнего триггера.
Поскольку вы не указываете ExitAction, он, вероятно, просто выполняет BeginAnimation(..., null)
, чтобы очистить анимацию EnterAction. Вы можете проверить это, переупорядочив триггеры, и вы увидите, что последний всегда действует.
Подобный вопрос можно найти здесь . Но, похоже, даже при этом он не работает должным образом.
Я бы, вероятно, пошел с пользовательским элементом управления, который обрабатывает анимацию масштабирования для вас. Что-то вроде:
public class AnimatedZoomDecorator : Decorator {
public static readonly DependencyProperty ZoomLevelProperty = DependencyProperty.Register("ZoomLevel",
typeof(double), typeof(AnimatedZoomDecorator), new FrameworkPropertyMetadata(1.0, OnZoomLevelPropertyValueChanged));
public double ZoomLevel {
get { return (double)this.GetValue(ZoomLevelProperty); }
set { this.SetValue(ZoomLevelProperty, value); }
}
private static void OnZoomLevelPropertyValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {
AnimatedZoomDecorator control = d as AnimatedZoomDecorator;
if (control != null) {
ScaleTransform scaleTransform = control.LayoutTransform as ScaleTransform;
if (scaleTransform == null)
control.LayoutTransform = scaleTransform = new ScaleTransform();
DoubleAnimation animation = new DoubleAnimation() {
To = control.ZoomLevel,
DecelerationRatio = 0.5,
Duration = new Duration(TimeSpan .FromMilliseconds(500)),
};
scaleTransform.BeginAnimation(ScaleTransform.ScaleXProperty, animation);
scaleTransform.BeginAnimation(ScaleTransform.ScaleYProperty, animation);
}
}
}
Что может быть использовано следующим образом:
<DataTemplate>
<local:AnimatedZoomDecorator x:Name="zoom">
<TextBlock Text="{Binding .}" />
</local:AnimatedZoomDecorator>
<DataTemplate.Triggers>
<!-- shrink -->
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Value="False"
Binding="{Binding Path=IsSelected, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}}" />
<Condition Value="1"
Binding="{Binding Path=SelectedItems.Count, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBox}}}" />
</MultiDataTrigger.Conditions>
<Setter TargetName="zoom" Property="ZoomLevel" Value="0.5" />
</MultiDataTrigger>
<!-- selected (Grow) -->
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Value="True"
Binding="{Binding Path=IsSelected, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}}" />
<Condition Value="1"
Binding="{Binding Path=SelectedItems.Count, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBox}}}" />
</MultiDataTrigger.Conditions>
<Setter TargetName="zoom" Property="ZoomLevel" Value="2" />
</MultiDataTrigger>
</DataTemplate.Triggers>
</DataTemplate>