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

时间:2016-03-21 19:50:50

标签: xaml windows-phone win-universal-app

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

我设计的UserControl内部使用ListView,但我想覆盖此行为,因为它并不适合应用程序提出的设计。

贝娄是VisualStateGroups我试图通过其ListViewControlTemplate通过其ListViewItem定义同时应用于DataTemplate,前一次尝试失败

<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,也无法通过自己找到正确的方法。

2 个答案:

答案 0 :(得分:0)

我使用ListViewItemPresenter,因为我相信你已经发现了。并且,我相信您已经发现它不具备模板功能。这种更加封装的方法的目的纯粹是性能。因此,ListView中的项目渲染速度要快得多。但是,它确实意味着当你想要改变它时,你就会陷入困境。这是否意味着您无法更改它以使用您自己的演示者并解除性能改进?这是否意味着您将拥有大量自定义代码?是。这是否意味着它不可能?不,这是否意味着它是一个好主意?好。我不知道如何回答这个问题。但是,至少你知道为什么它似乎是一堵砖墙。

答案 1 :(得分:0)

花了一些时间,但最终它比预期的要简单。我只需要添加一个ControlTemplate定位ListViewItem,我之前没有这样做,因为我正在摆弄ControlTemplate的{​​{1}}。

由于我们未直接声明ListView,因此使用ListViewItem的方式。最终结果如下:

ListView.ItemContainerStyle

正如您所看到的,空<ListView.ItemContainerStyle> <Style TargetType="ListViewItem"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="ListViewItem"> <ListViewItemPresenter /> </ControlTemplate> </Setter.Value> </Setter> </Style> </ListView.ItemContainerStyle> 足以覆盖大多数默认行为。我无法摆脱紧迫的动画,但我对目前的结果感到满意。