События WPF ListViewItem не запускаются должным образом на сенсорном экране

 <Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        WindowState="Maximized"
        Title="MainWindow" Height="550" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition Height="4*"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <TextBox Name="TextBox" VerticalContentAlignment="Center" FontSize="30" ></TextBox>
        <ListView Grid.ColumnSpan="6"  Grid.Row="1"
                     x:Name="GridControlProducts"
                    SelectionMode="Single"
                    ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                    ScrollViewer.VerticalScrollBarVisibility="Disabled">
            <ListView.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel Orientation="Horizontal" />
                </ItemsPanelTemplate>
            </ListView.ItemsPanel>
            <ListView.ItemContainerStyle>
                <Style TargetType="{x:Type ListViewItem}">
                    <Setter Property="Width" Value="200"/>
                    <Setter Property="Height" Value="200"/>
                    <EventSetter Event="PreviewMouseDown" Handler="button_Click" />
                </Style>
            </ListView.ItemContainerStyle>
        </ListView>       


        <Button Content="Close" Grid.Column="0" Grid.Row="2" Click="Button_Click_1" ></Button>

    </Grid>
</Window>
// code behind
public MainWindow()
        {
            InitializeComponent();

            for (int i = 0; i < 10; i++)
            {
                this.GridControlProducts.Items.Add("Test");
            }
        }

 private int c = 1;
        private void button_Click(object sender, RoutedEventArgs e)
        {
            this.TextBox.Text = this.c++.ToString();
        }

У меня есть приложение с сенсорным экраном WPF, которое содержит список продуктов в шаблоне представления списка.

С помощью мыши все работает так, как вы ожидаете. Однако на сенсорном экране сенсорные события не срабатывают каждый раз. Например, если я нажму 10 кнопок подряд в виде списка, возможно, 7 касаний будут зарегистрированы, а 3 касания - нет.

Если я сам касаюсь стандартной кнопки, она очень отзывчива. Кнопки в моём шаблоне нет (очень ударил и пропустил).

Я создал простое тестовое приложение (см. Выше), чтобы проверить это, и поведение в моем тестовом приложении такое же.

Когда он не регистрируется, ранее выбранный элемент списка остается выбранным, а выбранный мной элемент, который не был зарегистрирован, светло-голубой (например, при наведении курсора мыши)

Любая помощь будет принята с благодарностью.

3 ответа

<configuration>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.Windows.Input.Stylus.DisableStylusAndTouchSupport=true" />
  </runtime>
</configuration>

Наконец-то нашел исправление. Я положил выше в моем файле конфигурации, и проблема решена.

Спасибо за все ответы.

Резюме

  • Никогда не используйте Click событие в ListView / ListBox использовать PreviewMouseDown вместо.
  • Ваше сенсорное устройство может иметь низкую точность касания, чем большинство других.

подробности

Несколько лет назад я страдал от одной и той же проблемы и обнаружил, что ее поведение на разных сенсорных устройствах различно. На большинстве сенсорных устройств тач работает каждый раз. Но на некоторых других прикосновение может быть потеряно случайно.

Если вы попытаетесь заметить, что ваше движение стучит по сенсорному экрану, вы можете обнаружить, что касание будет потеряно, если ваш палец отодвинется при нажатии на очень небольшое расстояние. Такое поведение происходит только в ListViewItem или ListBoxItem, потому что ListView и ListBox обрабатывают события касания и повторно вызывают их для их поведения прокрутки касания.

MouseDown а также MouseUp на том же контроле делает Click событие, как и события касания. Но в ListBox или ListView события щелчка должны находиться в одной точке, а не в одном и том же элементе управления. Потому что ListView/ListBox не нужно сначала обрабатывать события мыши, поэтому щелчок мыши работает нормально.

Различие между сенсорными устройствами различного типа заключается в точности их касания. Чем ниже точность, тем больше сенсорных событий будет потеряно.

Что вы можете сделать, это:

  • Никогда не используйте Click событие в ListView / ListBox использовать PreviewMouseDown вместо.

Я знаю, что этот вопрос довольно старый, но, может быть, кто-то еще придет сюда в поисках решения этой проблемы, как я. walterlv очень хорошо описал проблему. Если вам не нужно поведение сенсорной прокрутки ListView и вас интересует событие SelectionChanged, вы можете добавить это в свой ListView:

      <ListView.ItemContainerStyle>
   <Style TargetType="ListViewItem">
      <Style.Triggers>
         <Trigger Property="IsStylusOver" Value="True">
            <Setter Property="IsSelected" Value="True"/>
         </Trigger>
      </Style.Triggers>
   </Style>
</ListView.ItemContainerStyle>

Таким образом, каждое прикосновение к ListViewItem надежно выбирает его и запускает событие SelectionChanged.

Другие вопросы по тегам