我有一种情况,我想根据主机的渲染能力有选择地禁用一些效果。我正在使用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
正如mm8(谢谢!)在评论中指出的,我可以使用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>
编辑2
有关在事件触发器中切换动画的方法,请参阅:WPF MultiDataTrigger on Tag property only firing once
你可以使用有两个条件的MultiDataTrigger;一个绑定到MenuModel.IsVisible
,另一个绑定到RenderCapabilityWrapper.Tier
然后设置行动并使用适当的Storyboards
:
<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>