Кнопка UWP исчезает при изменении видимости, какой триггер использовать? - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь создать AppBarButton в UWP, который исчезает, когда он становится видимым.

Для этого я скопировал стиль AppBarButton и добавил еще одну VisualStateGroup с триггерами из пакета nuget WindowsStateTriggers.

<ControlTemplate TargetType="AppBarButton">
    <Grid x:Name="Root" MinWidth="{TemplateBinding MinWidth}" MaxWidth="{TemplateBinding MaxWidth}" Background="{TemplateBinding Background}" CornerRadius="{TemplateBinding CornerRadius}" Margin="1,0">
        <VisualStateManager.VisualStateGroups>
            <VisualStateGroup x:Name="VisibilityStates">
                <VisualState x:Name="Hidden">
                    <VisualState.Setters>
                        <Setter Target="ContentRoot.Opacity" Value="0"/>
                    </VisualState.Setters>
                    <VisualState.StateTriggers>
                        <windowsStateTriggers:EqualsStateTrigger Value="{Binding ElementName=Root, Path=Visibility}" EqualTo="Hidden"/>
                    </VisualState.StateTriggers>
                </VisualState>
                <VisualState x:Name="Visible">
                    <VisualState.Storyboard>
                        <Storyboard>
                            <DoubleAnimation Storyboard.TargetName="ContentRoot" Storyboard.TargetProperty="Opacity"
                                             From="0" To="1.0" Duration="0:0:1" />
                        </Storyboard>
                    </VisualState.Storyboard>
                    <VisualState.StateTriggers>
                        <windowsStateTriggers:EqualsStateTrigger Value="{Binding ElementName=Root, Path=Visibility}" EqualTo="Visible"/>
                    </VisualState.StateTriggers>
                </VisualState>
            </VisualStateGroup>

Проблема заключается в попытке запуска с использованием видимости.С помощью приведенного выше кода, когда элемент управления впервые становится видимым, все приложение приостанавливается на секунду, а затем запускается постепенное исчезновение анимации.Затем при последующих изменениях видимости анимация больше не запускается.

Я предполагаю, что проблема в EqualsStateTrigger, поскольку при использовании встроенного AdaptiveTrigger с произвольным размером окна я могу запускать все нормально.

Вопросы:

  • Какой триггер мне следует использовать здесь?
  • Есть ли способ заменить VisualState для этой группы вместо XAML страницы?
  • Есть ли другой способ сделать это, который не требует перезаписи шаблона элемента управления?Я знаю, что для WPF была библиотека Transistionz от SciChart, но я не могу найти ее для UWP.

1 Ответ

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

(см. Обновление в конце)

Чтобы ответить на мой собственный вопрос, основной проблемой с приведенным выше кодом была привязка.Это должно быть {Binding RelativeSource={RelativeSource TemplatedParent}, Path=Visibility}.Также «скрытое» визуальное состояние не обязательно.например,

 <VisualStateGroup x:Name="VisibilityStates"><VisualState x:Name="Visible">
                <VisualState.Storyboard>
                    <Storyboard>
                        <DoubleAnimation Storyboard.TargetName="ContentRoot" Storyboard.TargetProperty="Opacity"
                                         From="0" To="1.0" Duration="0:0:1" />
                    </Storyboard>
                </VisualState.Storyboard>
                <VisualState.StateTriggers>
                    <windowsStateTriggers:EqualsStateTrigger Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Visibility}" EqualTo="Visible"/>
                </VisualState.StateTriggers>
            </VisualState>
        </VisualStateGroup>

Этот метод включает редактирование шаблона элемента управления.Если вы не хотите этого делать, вы можете поместить VisualStateGroup под первым элементом Grid (он не будет работать непосредственно под Page) и иметь несколько анимаций, нацеленных на разные кнопки, а триггер поставить под элемент управления.от которого зависит видимость других кнопок.Например,

    <VisualStateManager.VisualStateGroups>
        <VisualStateGroup x:Name="MultiSelect">
            <VisualState x:Name="Checked">
                <VisualState.Storyboard>
                    <Storyboard>
                        <DoubleAnimation Storyboard.TargetName="buttonSelectAll" Storyboard.TargetProperty="Opacity"
                                         From="0" To="1.0" Duration="0:0:0.3" />
                        <DoubleAnimation Storyboard.TargetName="buttonClearAll" Storyboard.TargetProperty="Opacity"
                                         From="0" To="1.0" Duration="0:0:0.3" />
                    </Storyboard>
                </VisualState.Storyboard>
                <VisualState.Setters>
                    <Setter Target="buttonSelectAll.Visibility" Value="Visible" />
                    <Setter Target="buttonClearAll.Visibility" Value="Visible" />
                </VisualState.Setters>
                <VisualState.StateTriggers>
                    <windowsStateTriggers:EqualsStateTrigger Value="{Binding ElementName=buttonSelect, Path=IsChecked}" EqualTo="True"/>
                </VisualState.StateTriggers>
            </VisualState>
        </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>

Обновление

Этого также можно добиться с помощью CompositionAnimations с помощью Инструментария сообщества Windows

...