您可以使用VisualStateManager将悬停行为应用于XAML网格吗?

时间:2018-05-11 22:51:04

标签: c# windows-store-apps winrt-xaml uwp-xaml visualstatemanager

我有一个定义GridView的UWP XAML页面。各个GridView项目都是网格。像这样:

    <GridView Name="TheGridView" ItemsSource="{x:Bind stuff}">

        <GridView.ItemTemplate>
            <DataTemplate x:DataType="more stuff">
                <Grid Background="{StaticResource TheBlackColor}">

                    ...stuff here...                    

                </Grid>
            </DataTemplate>
        </GridView.ItemTemplate>

   </GridView>

当鼠标悬停在项目上时,我想更改网格的背景颜色(从TheBlackColor到其他东西)。我知道我可以在网格上放置PointerEntered和PointerExited事件,然后在我的代码后面我可以设置背景属性,但这似乎是VisualStateManager的用途。

但是,我无法弄清楚如何让VisualStateManager为此工作。如果我在XAML中定义可视状态,那么我假设我仍然会连接到网格上的PointerEntered和PointerExited事件,但在我的代码后面我将调用GoToState来切换状态。但是,我不知道如何告诉GoToState XAML树中的哪个项需要更改其可视状态。我认为我只是将悬停的网格项传递给GoToState的第一个参数(它在我的PointerEntered事件中作为'sender'给我) - 除了我不能,因为GoToState的第一个参数是一个Control和网格不是从Control派生的。

1 个答案:

答案 0 :(得分:1)

根据您的要求,您可以使用XAML Behaviors来实现此功能。请参阅以下代码。

<Page
    x:Class="VisualStateTest.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:VisualStateTest"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:Interactivity="using:Microsoft.Xaml.Interactivity"
    xmlns:Core="using:Microsoft.Xaml.Interactions.Core"
    xmlns:Media="using:Microsoft.Xaml.Interactions.Media"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Grid>
        <Interactivity:Interaction.Behaviors>
            <Core:EventTriggerBehavior EventName="PointerEntered">
                <Core:ChangePropertyAction PropertyName="Background">
                    <Core:ChangePropertyAction.Value>
                        <SolidColorBrush Color="Red"/>
                    </Core:ChangePropertyAction.Value>
                </Core:ChangePropertyAction>
            </Core:EventTriggerBehavior>
        </Interactivity:Interaction.Behaviors>
    </Grid>
</Page>