我有一个列表视图,其中没有几个项目。每当我选择列表视图项目时,它对应的选定状态就会滞后,直到释放键盘或鼠标指针为止。为了使我仅在单击项目时就立即反映出对项目的选择,无论是否释放了键/鼠标指针,应该怎么做。我尝试使用带有项目的基本listview,这似乎是默认行为...只是好奇地知道是否可以覆盖
在相同图片的样本图像下方,粉红色表示已经选择的项目,灰色表示将要选择的项目,而我的鼠标/键仍未释放,给人的印象是尚未选择选择,它是落后的。无论我释放的鼠标/按键如何,如何确保灰色选择自动变为粉红色。
<ListView x:Name="TestingList"
ItemsSource="{x:Bind TestListing.Details}"
SelectedItem="{x:Bind TestListing.DefaultSelected,Mode=TwoWay}"
SelectionChanged="TestList_SelectionChanged"
SelectionMode="Single">
<ListView.ItemContainerTransitions>
<TransitionCollection/>
</ListView.ItemContainerTransitions>
<ListView.ItemTemplate>
<DataTemplate x:DataType="test:TestingName">
<TextBlock Margin="42,5,0,0" Style="{StaticResource TextStyle}"
Text="{x:Bind Name}" TextWrapping="Wrap"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
有什么想法吗?
答案 0 :(得分:0)
每当我选择列表视图项目时,它对应的选定状态就会滞后,直到释放键盘或鼠标指针为止。
我终于明白了你的问题。您描述的行为是默认行为。请按照我的步骤来了解基本原理。
单击“ Visual Studio中的文档大纲”->右键单击ListView控件->编辑其他模板->编辑生成的项目容器(ItemContainerStyle)->编辑副本
您将获得ListViewItem的样式。在ControlTemplate中找到ListViewItemPresenter
。您将看到PressedBackground="{ThemeResource ListViewItemBackgroundPressed}"
和SelectedBackground="{ThemeResource ListViewItemBackgroundSelected}"
。如果将PressedBackground
更改为'ThemeResource ListViewItemBackgroundSelected',则将是您想要的。
<Style x:Key="ListViewItemRevealStyle" TargetType="ListViewItem">
......
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListViewItem">
<ListViewItemPresenter x:Name="Root" CheckBrush="{ThemeResource ListViewItemCheckBrush}" ContentMargin="{TemplateBinding Padding}" CheckBoxBrush="{ThemeResource ListViewItemCheckBoxBrush}" ContentTransitions="{TemplateBinding ContentTransitions}" CheckMode="{ThemeResource ListViewItemCheckMode}" DragOpacity="{ThemeResource ListViewItemDragThemeOpacity}" DisabledOpacity="{ThemeResource ListViewItemDisabledThemeOpacity}" DragBackground="{ThemeResource ListViewItemDragBackground}" DragForeground="{ThemeResource ListViewItemDragForeground}" FocusBorderBrush="{ThemeResource ListViewItemFocusBorderBrush}" FocusVisualMargin="{TemplateBinding FocusVisualMargin}" FocusSecondaryBorderBrush="{ThemeResource ListViewItemFocusSecondaryBorderBrush}" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" Control.IsTemplateFocusTarget="True"
PressedBackground="{ThemeResource ListViewItemBackgroundPressed}" PlaceholderBackground="{ThemeResource ListViewItemPlaceholderBackground}" PointerOverForeground="{ThemeResource ListViewItemForegroundPointerOver}" PointerOverBackground="{ThemeResource ListViewItemBackgroundPointerOver}" RevealBorderThickness="{ThemeResource ListViewItemRevealBorderThemeThickness}" ReorderHintOffset="{ThemeResource ListViewItemReorderHintThemeOffset}" RevealBorderBrush="{ThemeResource ListViewItemRevealBorderBrush}" RevealBackground="{ThemeResource ListViewItemRevealBackground}" SelectedForeground="{ThemeResource ListViewItemForegroundSelected}" SelectionCheckMarkVisualEnabled="{ThemeResource ListViewItemSelectionCheckMarkVisualEnabled}"
SelectedBackground="{ThemeResource ListViewItemBackgroundSelected}" SelectedPressedBackground="{ThemeResource ListViewItemBackgroundSelectedPressed}" SelectedPointerOverBackground="{ThemeResource ListViewItemBackgroundSelectedPointerOver}" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}">
答案 1 :(得分:0)
只是想出一种方法来解决这个问题。
它解决了我的用例。谢谢@Xavier和@Mehrzad在此方面的时间。非常感谢。
XAML
<ListView x:Name="TestingList"
ItemsSource="{x:Bind TestListing.Details}"
SelectedItem="{x:Bind TestListing.DefaultSelected,Mode=TwoWay}"
SelectionChanged="TestList_SelectionChanged"
SelectionMode="Single">
<ListView.ItemContainerTransitions>
<TransitionCollection/>
</ListView.ItemContainerTransitions>
<ListView.ItemTemplate>
<DataTemplate x:DataType="test:TestingName">
<TextBlock Margin="42,5,0,0" Style="{StaticResource TextStyle}" PointerPressed="Test_PointerPressed"
Text="{x:Bind Name}" TextWrapping="Wrap"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
XAML.cs
private void Test_PointerPressed(object sender, PointerRoutedEventArgs e)
{
TestingList.SelectedItem = null;
TestingName x = e.OriginalSource as TextBlock).DataContext as TestingName);
}