Диспетчер визуальных состояний реагирует на события дочернего элемента управления - PullRequest
0 голосов
/ 12 июля 2020

Я пытался реорганизовать свое приложение wpf, чтобы использовать Visual State Manager вместо триггеров, но столкнулся с парой проблем, которые не могу решить.

<UserControl
    x:Class="Controls.Button.ArtisanButton"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    mc:Ignorable="d">

    <UserControl.Resources>

    </UserControl.Resources>


    <Grid VerticalAlignment="Center"
          Margin="{Binding RelativeSource={RelativeSource Self},
                           Path=Margin,
                           Mode=OneTime}">

        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="4" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>

        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>


        <Rectangle x:Name="FocusMarker"
                   Grid.Column="0"
                   Grid.Row="0"
                   Style="{StaticResource VerticalFocusMarkerBaseStyle}" />


        <Button Grid.Column="1"
                Grid.Row="0"
                Style="{StaticResource ArtisanButtonBaseStyle}"
                Content="{Binding Content,
                                  Mode=OneTime}"

                Command="{Binding ClickAction}"

                IsCancel="{Binding Cancel,
                                   Mode=OneTime}"

                IsDefault="{Binding IsDefault,
                                    Mode=OneTime}"

                ToolTip="{Binding ToolTip,
                                  Mode=OneWay}" />


        <VisualStateManager.VisualStateGroups>
            <VisualStateGroup Name="FocusStates">
                <VisualState Name="Unfocused">
                    <Storyboard>
                        <DoubleAnimation Storyboard.TargetName="FocusMarker"
                                         Storyboard.TargetProperty="Opacity"
                                         To="0"
                                         Duration="0:0:0.25" />
                    </Storyboard>
                </VisualState>

                <VisualState Name="Focused">
                    <Storyboard>
                        <DoubleAnimation Storyboard.TargetName="FocusMarker"
                                         Storyboard.TargetProperty="Opacity"
                                         To="1"
                                         Duration="0:0:0.25" />
                    </Storyboard>
                </VisualState>
            </VisualStateGroup>
        </VisualStateManager.VisualStateGroups>
    </Grid>
</UserControl>

Вопрос 1. В приведенном выше коде визуальное состояние Focused никогда не вызывается, я думаю, это потому, что Grid не может получить Focus, но, насколько я понимаю, VisualStateManager должен быть включен только в элемент root, так что я могу сделать чтобы заставить его работать?

Вопрос 2: мне нужно, чтобы VisualStateManager отвечал на дочерний элемент управления Button, а не на root Grid, но я не могу разместить VisualStateManager на Кнопка, потому что кнопка не является элементом управления root. Есть ли способ сделать это?

Спасибо за любую помощь, которую вы можете мне оказать.

...