UWP VisualStateManager PointerOver не работает

Я имитирую поведение Groove Music, которое отображает эффект тени при наведении курсора мыши на обложку альбома (в моем коде это весь DataTemplate). Но мой VisualStateManager, похоже, не работает. Любые идеи? Я реализовал это программно, но для практики хочу использовать xaml.

---Обновлять---

Переход от Stackpanel к Grid по-прежнему не работает.

    <GridView
        Grid.Row="1"
        Margin="10"
        IsItemClickEnabled="True"
        ItemsSource="{x:Bind Albums}">
        <GridView.ItemTemplate>
            <DataTemplate x:DataType="data:GridAlbumView">
                <Grid
                    Width="180"
                    Height="240"
                    Margin="10">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="Auto" />
                    </Grid.RowDefinitions>
                    <controls:DropShadowPanel
                        x:Name="AlbumShadowPanel"
                        VerticalContentAlignment="Top"
                        BlurRadius="15"
                        OffsetX="4"
                        OffsetY="4"
                        ShadowOpacity="0"
                        Color="Black">
                        <Image Source="{x:Bind Cover}" />
                    </controls:DropShadowPanel>
                    <TextBlock
                        Margin="0,5,0,0"
                        Grid.Row="1"
                        FontWeight="SemiBold"
                        MaxLines="2"
                        Text="{x:Bind Name}"
                        TextAlignment="Left"
                        TextWrapping="Wrap"
                        Visibility="{x:Bind Name, Converter={StaticResource AlbumNameVisibilityConverter}}" />
                    <TextBlock
                        Grid.Row="2"
                        FontSize="12"
                        Foreground="Gray"
                        Text="{x:Bind Artist}"
                        TextAlignment="Left" />
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="CommonStates">
                            <VisualState x:Name="PointerOver">
                                <Storyboard>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="AlbumShadowPanel" Storyboard.TargetProperty="ShadowOpacity">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="1" />
                                    </ObjectAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                </Grid>
            </DataTemplate>
        </GridView.ItemTemplate>
    </GridView>

person Community    schedule 13.08.2019    source источник
comment
Привет, вы можете использовать VisualStateManager.GoToState(this, "PointerOver", true); для завершения переключения состояния   -  person Richard Zhang - MSFT    schedule 12.09.2019


Ответы (1)


Это потому, что StackPanel не является элементом управления. Только элементы управления поддерживают VisualStates. Вы можете просто создать прозрачный элемент управления, который вы помещаете поверх всего (при условии, что вам не нужно взаимодействовать с чем-то внутри элемента управления). Извините, я знаю, что это может сбивать с толку.

public class MyOverlayControl : Control
{
    public MyOverlayControl() : base()
    {
        Background = new SolidColorBrush(Colors.Transparent);
        HorizontalAlignment = HorizontalAlignment.Stretch;
        VerticalAlignment = VerticalAlignment.Stretch;
        PointerEntered += (s, e) => VisualStateManager.GoToState(this, nameof(PointerEntered), true);
        PointerExited += (s, e) => VisualStateManager.GoToState(this, nameof(PointerExited), true);
    }
}
person Jerry Nixon    schedule 13.08.2019
comment
Я заметил, что сетка - это элемент управления, поэтому я заменил стековую панель на сетку. Однако это все еще не работает. Я также обновил свой код выше. Кстати, могу ли я отменить эффект PointerOver по умолчанию, переопределив его таким образом? - person ; 14.08.2019