除非选择后释放了鼠标指针,否则Listview的选定项目与该项目的选定状态不同步

时间:2019-05-29 19:38:01

标签: c# listview uwp

我有一个列表视图,其中没有几个项目。每当我选择列表视图项目时,它对应的选定状态就会滞后,直到释放键盘或鼠标指针为止。为了使我仅在单击项目时就立即反映出对项目的选择,无论是否释放了键/鼠标指针,应该怎么做。我尝试使用带有项目的基本listview,这似乎是默认行为...只是好奇地知道是否可以覆盖

在相同图片的样本图像下方,粉红色表示已经选择的项目,灰色表示将要选择的项目,而我的鼠标/键仍未释放,给人的印象是尚未选择选择,它是落后的。无论我释放的鼠标/按键如何,如何确保灰色选择自动变为粉红色。

enter image description here

<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>

有什么想法吗?

2 个答案:

答案 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)

只是想出一种方法来解决这个问题。

  1. 将指针按下事件添加到文本块。
  2. 在指针按下事件中将所选项目清空为空。当指针处于按下状态时,这将立即清除项目的选定状态,并且由于选择更改事件仅在此事件之后才触发,因此在按下状态下进行的清除不会影响所选的新项目。
  3. 从指针按下事件获取数据上下文并执行所需的操作。

它解决了我的用例。谢谢@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);

 }