Xaml 如何在UWP中更改ListViewItem的视觉行为?

Xaml 如何在UWP中更改ListViewItem的视觉行为?,xaml,windows-phone,win-universal-app,Xaml,Windows Phone,Win Universal App,在UWP中,每次选择ListViewItem,都会触发情节提要,让用户感觉组件对触摸压力做出反应。该情节提要还会更改ListViewItem的背景色,直到发布 我设计了一个UserControl,它在内部使用ListView,但希望覆盖此行为,因为它并不真正适合应用程序的建议设计 下面是VisualStateGroups我试图通过其ControlTemplate应用于ListView,并通过其DataTemplate定义应用于ListViewItem,因为前一次尝试失败 <VisualSt

在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中的项目渲染速度明显加快。然而,这确实意味着,当你想改变它时,你有点被卡住了。这是否意味着您不能将其更改为使用自己的演示者并取消性能改进?这是否意味着您将拥有大量自定义代码?对这是否意味着这是不可能的?不,这是否意味着这是个好主意?好。我不知道怎么回答这个问题。但是,至少你知道为什么它看起来像一堵砖墙。

这花了一些时间,但最终它比预期的要简单。我只需要添加一个
ControlTemplate
来定位
ListViewItem
,之前我没有添加,因为我一直在摆弄
ListView
ControlTemplate

由于我们不直接声明
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
足以覆盖大多数默认行为。我无法摆脱按下的动画,但我对当前的结果很满意。

这有记录吗?没有看到像这样的细节