在UWP中,每次选择ListViewItem
时,都会触发故事板,让用户感觉到组件对触摸的压力做出反应。该故事板还会更改ListViewItem
的背景颜色,直到它被释放。
我设计的UserControl
内部使用ListView
,但我想覆盖此行为,因为它并不适合应用程序提出的设计。
贝娄是VisualStateGroups
我试图通过其ListView
和ControlTemplate
通过其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,也无法通过自己找到正确的方法。
答案 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>
足以覆盖大多数默认行为。我无法摆脱紧迫的动画,但我对目前的结果感到满意。