Выбранный элемент списка просмотра не синхронизирован с выбранным состоянием элемента, если после выбора указатель мыши не отпущен - PullRequest
1 голос
/ 29 мая 2019

У меня есть представление списка с несколькими пунктами.Всякий раз, когда я выбираю свой элемент списка, соответствующее ему выбранное состояние отстает до тех пор, пока не отпущена моя клавиатура или указатель мыши.Что нужно сделать, чтобы выбор элемента сразу отражался, когда я просто нажимал на элемент, независимо от того, отпущена ли клавиша / указатель мыши.Я попытался с базовым списком с элементами, и это, кажется, поведение по умолчанию ... Просто любопытно знать, может ли это быть переопределено

Прилагается ниже образца изображения того же, где розовый цвет обозначает уже выбранныйitem и серый цвет - это элемент, который должен быть выбран с моей еще не отпущенной мышью / ключом, что создает впечатление, что он еще не выделен и отстает.Как я могу убедиться, что серый выбор автоматически становится розовым, независимо от того, отпущена моя мышь / клавиша.

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>

Есть мысли?

enter image description here

Ответы [ 2 ]

1 голос
/ 31 мая 2019

Всякий раз, когда я выбираю свой элемент представления списка, его соответствующее выбранное состояние отстает до тех пор, пока не отпущена моя клавиатура или указатель мыши.

Я наконец понял ваш вопрос.Поведение, которое вы описали, является поведением по умолчанию.Пожалуйста, следуйте моим шагам, чтобы понять основные принципы.

Щелкните «Схема документа в visual studio» -> щелкните правой кнопкой мыши элемент управления ListView -> Изменить дополнительные шаблоны -> Редактировать контейнер сгенерированного элемента (ItemContainerStyle) -> Редактировать копию

Вы получите стиль ListViewItem.Найдите ListViewItemPresenter в шаблоне ControlTemplate.Вы увидите 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}">
0 голосов
/ 21 июня 2019

Только что нашел способ справиться с этим.

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

 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...