WPF ListViewItem事件无法在触摸屏上正确触发

Sao*_*rse 6 c# wpf events xaml touchscreen

 <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();
        }
Run Code Online (Sandbox Code Playgroud)

我有一个WPF触摸屏应用程序,该应用程序在列表视图模板中包含产品列表。

使用鼠标,一切正常。但是,在触摸屏上,触摸事件不会每次触发。例如,如果我连续在列表视图中按10个按钮,则可能会注册7次触摸,而不会进行3次触摸。

如果我自己触摸标准按钮,则响应速度非常快。我模板中的按钮不是(很容易碰到)。

我创建了一个简单的测试应用程序(请参见上文)以对此进行测试,并且测试应用程序上的行为相同。

当它未注册时,仍会选择先前选择的listviewitem,并且我尚未选择的项目是浅蓝色(例如,当您将鼠标悬停在上面时)

任何帮助将不胜感激。

Sao*_*rse 5

<configuration>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.Windows.Input.Stylus.DisableStylusAndTouchSupport=true" />
  </runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud)

终于找到了解决办法。我将上述内容放入我的配置文件中,问题已解决。

感谢您的所有回复。


wal*_*rlv 2

概括

  • 切勿在/中使用Click事件,而是使用。ListViewListBoxPreviewMouseDown
  • 您的触摸设备的触摸精度可能比大多数其他设备低。

细节

几年前我也遇到过同样的问题,发现它在不同的触摸设备上表现不同。在大多数触摸设备上,触摸每次都会起作用。但在其他一些设备上,触摸可能会随机丢失。

如果您尝试注意在触摸屏上敲击的移动,您可能会发现,如果您的手指在按下时移动了很小的距离,触摸就会消失。此行为仅发生在 ListViewItem 或 ListBoxItem 上,因为 ListView 和 ListBox 处理触摸事件并重新引发它们的触摸滚动行为。

MouseDownMouseUp同一个控件上创建一个Click事件,触摸事件也是如此。但在 ListBox 或 ListView 上,单击事件必须位于同一点,而不是同一控件。因为ListView/ListBox不需要先处理鼠标事件,所以鼠标单击可以正常工作。

不同类型的触摸设备之间的区别在于它们的触摸精度。精度越低,丢失的触摸事件就越多。

你能做的是:

  • 切勿在/中使用Click事件,而是使用。ListViewListBoxPreviewMouseDown