如何改变 UWP 中 ListViewItem 的视觉行为?

How to alter the visual behavior of a ListViewItem in UWP?

在 UWP 中,每次选择 ListViewItem 时,都会触发故事板,让用户感觉组件正在对触摸压力做出反应。该故事板还会更改 ListViewItem 的背景颜色,直到它被发布。

我设计了一个 UserControl,它在内部使用 ListView,但我想覆盖此行为,因为它并不真正适合应用程序的建议设计。

波纹管是 VisualStateGroups 我试图通过它的 ControlTemplate 应用到 ListView 和通过它的 DataTemplate 定义应用到 ListViewItem 作为前者尝试失败。

<VisualStateManager.VisualStateGroups>
    <VisualStateGroup x:Name="CommonStates">
        <VisualState x:Name="Normal" />
        <VisualState x:Name="PointerOver" />
        <VisualState x:Name="Pressed" />
        <VisualState x:Name="PointerOverPressed" />
        <VisualState x:Name="Disabled" />
    </VisualStateGroup>
    <VisualStateGroup x:Name="FocusStates">
        <VisualState x:Name="Focused" />
        <VisualState x:Name="UnFocused" />
        <VisualState x:Name="PointerFocused" />
    </VisualStateGroup>
    <VisualStateGroup x:Name="SelectionStates">
        <VisualState x:Name="Unselecting" />
        <VisualState x:Name="Unselected" />
        <VisualState x:Name="UnselectedPointerOver" />
        <VisualState x:Name="UnselectedSwiping" />
        <VisualState x:Name="Selecting" />
        <VisualState x:Name="Selected" />
        <VisualState x:Name="SelectedSwiping" />
        <VisualState x:Name="SelectedUnfocused" />
    </VisualStateGroup>
</VisualStateManager.VisualStateGroups>

一种可能是将 DataTemplate 的根网格绑定到 ItemsContainer,这样我就可以在每次选择项目时覆盖默认行为。但我不是那么精通 XAML 并且无法自己找出正确的方法。

这使用了 ListViewItemPresenter,我相信您已经发现了。而且,我相信您已经发现它不能使用模板。这种更加封装的方法的目的纯粹是为了性能。因此,ListView 中的项目呈现速度明显更快。然而,这确实意味着当你想改变它时,你有点卡住了。这是否意味着您不能将其更改为使用您自己的演示器并取消性能改进?这是否意味着您将拥有大量自定义代码?是的。这是否意味着不可能?不,这是否意味着这是个好主意?出色地。我不知道怎么回答那个。但是,至少你知道为什么它看起来像一堵砖墙。

花了一些时间,但最终比预期的要简单。我只需要添加一个针对 ListViewItemControlTemplate,我之前没有这样做,因为我一直在摆弄 ListViewControlTemplate

由于我们不直接声明ListViewItem,所以使用ListView.ItemContainerStyle。最终结果如下:

<ListView.ItemContainerStyle>
    <Style TargetType="ListViewItem">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ListViewItem">
                    <ListViewItemPresenter />
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ListView.ItemContainerStyle>

如您所见,空 ListViewItemPresenter 足以覆盖大部分默认行为。我无法摆脱按压动画,但我对目前的结果很满意。