События WPF ListViewItem не запускаются должным образом на сенсорном экране - PullRequest
0 голосов
/ 23 мая 2018
 <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 касания не будут.

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 24 мая 2018
<configuration>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.Windows.Input.Stylus.DisableStylusAndTouchSupport=true" />
  </runtime>
</configuration>

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

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

0 голосов
/ 24 мая 2018

Сводка

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

Подробности

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

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

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

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

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

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