【问题标题】:UWP VisualStateManager PointerOver does not workUWP VisualStateManager PointerOver 不起作用
【发布时间】:2019-08-13 13:38:29
【问题描述】:

我正在模仿 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>

【问题讨论】:

  • 您好,您可以使用VisualStateManager.GoToState(this, "PointerOver", true);完成状态切换

标签: xaml uwp visualstatemanager visualstates visualstategroup


【解决方案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);
    }
}

【讨论】:

  • 我注意到 grid 是一个控件,所以我将 stackpanel 更改为 grid。但是,它仍然无法正常工作。我还更新了上面的代码。顺便说一句,我可以通过这种方式覆盖它来取消默认的 PointerOver 效果吗?
猜你喜欢
  • 2019-12-06
  • 1970-01-01
  • 2020-08-12
  • 2021-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多