Переключение раскадровки в триггере на основе возможности рендеринга - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть ситуация, когда я хочу выборочно отключить некоторые эффекты в зависимости от возможностей рендеринга хост-машины.Я использую 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 запускается только один раз

1 Ответ

0 голосов
/ 19 февраля 2019

Вы можете использовать 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...