基于RenderCapability在触发器中切换故事板

问题描述 投票:0回答:1

我有一种情况,我想根据主机的渲染能力有选择地禁用一些效果。我正在使用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

c# wpf
1个回答
1
投票

你可以使用有两个条件的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>
© www.soinside.com 2019 - 2024. All rights reserved.