У меня есть ситуация, когда я хочу выборочно отключить некоторые эффекты в зависимости от возможностей рендеринга хост-машины.Я использую RenderCapability.Tier, чтобы определить аппаратные возможности и раскрыл это XAML, используя статический класс и свойство зависимости.Однако в этой ситуации я не могу понять, как отключить эффект из кода XAML.
Рассматриваемый эффект - это эффект BlurEffect, присоединенный к сетке:
<Grid x:Name="contentGrid">
<Grid.Effect>
<BlurEffect Radius="0" />
</Grid.Effect>
...
</Grid>
Я знаю, что могу использовать триггер для удаления эффекта на основе уровня рендеринга:
<Trigger Property="local:RenderCapabilityWrapper.Tier" Value="0">
<Setter Property="Effect" Value="{x:Null}"/>
</Trigger>
Однако радиус размытия анимируется из триггера данных в шаблоне другого элемента управления:
<ControlTemplate TargetType="controls:Menu">
<ControlTemplate.Resources>
<Storyboard x:Key="FadeInContent">
<DoubleAnimation Storyboard.TargetProperty="ScreenContent.Opacity" From="0.1" To="1" Duration="0:0:.1" />
<DoubleAnimation Storyboard.TargetProperty="ScreenContent.Effect.Radius" From="3" To="0" Duration="0:0:.2" />
</Storyboard>
<Storyboard x:Key="FadeOutContent">
<DoubleAnimation Storyboard.TargetProperty="ScreenContent.Opacity" From="1" To="0.1" Duration="0:0:.2" />
<DoubleAnimation Storyboard.TargetProperty="ScreenContent.Effect.Radius" From="0" To="3" Duration="0:0:.2" />
</Storyboard>
</ControlTemplate.Resources>
<ControlTemplate.Triggers>
<DataTrigger Binding="{Binding Path=MenuModel.IsVisible, RelativeSource={RelativeSource Self}}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource FadeOutContent}" />
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<BeginStoryboard Storyboard="{StaticResource FadeInContent}" />
</ControlTemplate.Triggers>
...
Мне также нужно удалить ссылку из раскадровки.Я рассмотрел второй ресурс раскадровки без анимации размытия (например, FadeInContentLowQuality, FadInContentHighQuality), однако я не уверен, как переключаться между двумя анимациями в триггере данных MenuModel.IsVisible?
Редактировать 1
Как отметил мм8 (спасибо!) В комментариях, я могу использовать MultiDataTrigger для достижения желаемого эффекта для DataTriggers:
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Path=MenuModel.IsVisible, RelativeSource={RelativeSource Self}}" Value="True" />
<Condition Binding="{Binding Path=Tier, Source={x:Static local:RenderCapabilityWrapper.Instance}}" Value="0" />
</MultiDataTrigger.Conditions>
<MultiDataTrigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource FadeInMenu}" />
<BeginStoryboard Storyboard="{StaticResource FadeOutContentLow}" />
</MultiDataTrigger.EnterActions>
<MultiDataTrigger.ExitActions>
<BeginStoryboard Storyboard="{StaticResource FadeOutMenu}" />
<BeginStoryboard Storyboard="{StaticResource FadeInContentLow}" />
</MultiDataTrigger.ExitActions>
</MultiDataTrigger>
Последующий вопрос,есть ли эквивалентный метод, который я могу использовать для переключения анимации в EventTriggers?
<controls:PromptServiceListener>
<controls:PromptServiceListener.Resources>
<Storyboard x:Key="FadeOutLow">
<DoubleAnimation Storyboard.Target="{x:Reference rootLayout}" Storyboard.TargetProperty="Opacity" From="1" To="0.5" Duration="0:0:.2" />
</Storyboard>
<Storyboard x:Key="FadeOutHigh">
<DoubleAnimation Storyboard.Target="{x:Reference rootLayout}" Storyboard.TargetProperty="Opacity" From="1" To="0.5" Duration="0:0:.2" />
<DoubleAnimation Storyboard.Target="{x:Reference rootLayout}" Storyboard.TargetProperty="Effect.Radius" From="0" To="3" Duration="0:0:.2" />
</Storyboard>
</controls:PromptServiceListener.Resources>
<controls:PromptServiceListener.Triggers>
<EventTrigger RoutedEvent="controls:PromptServiceListener.PromptShown">
<BeginStoryboard>
<BeginStoryboard Storyboard="{StaticResource FadeOutHigh}" />
</BeginStoryboard>
</EventTrigger>
</controls:PromptServiceListener.Triggers>
</controls:PromptServiceListener>
Edit 2
Для метода переключения анимации в триггерах событий см .: WPF MultiDataTrigger для свойства Tag запускается только один раз