【问题标题】:WPF ListViewItem events not firing properly on TouchscreenWPF ListViewItem 事件未在触摸屏上正确触发
【发布时间】:2018-05-23 12:54:16
【问题描述】:
 <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 次触摸。

如果我自己触摸一个标准按钮,它会非常灵敏。我的模板中的按钮不是(非常受欢迎)。

我创建了一个简单的测试应用程序(见上文)来测试它,我的测试应用程序上的行为是相同的。

没有注册的时候,之前选中的listviewitem依然被选中,而我选中的没有注册的item是浅蓝色的(就像鼠标悬停的时候一样)

任何帮助将不胜感激。

【问题讨论】:

  • 如果您使用最新版本的 Visual Studio 2017 和 .Net Framework,是否会发生这种情况? WPF 中的 Touch 有改进和错误修复
  • 我升级到 vs 2017,目标是最新的框架 - 4.7.2。同样的问题。触摸事件仅在列表视图中随机触发
  • 我没有触摸屏来测试这个,但如果我正在开发一个新的触摸应用程序,我会使用 UWP 及其新的 API
  • 谢谢,但不幸的是,触摸屏方面是现有应用程序的新功能。这似乎是一个固有的 WPF 错误

标签: c# wpf xaml events touchscreen


【解决方案1】:
<configuration>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.Windows.Input.Stylus.DisableStylusAndTouchSupport=true" />
  </runtime>
</configuration>

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

感谢所有回复。

【讨论】:

  • 这似乎行得通!鼠标指针也被隐藏,没有 mouseover 事件。
  • 它确实解决了触摸有时不触发的问题,但由于它完全禁用了触摸,其他功能(如缩放、滚动)不再起作用。有没有人找到解决这些问题的其他方法?
【解决方案2】:

总结

  • 切勿在ListView/ListBox 中使用Click 事件,而是使用PreviewMouseDown
  • 您的触控设备的触控精度可能低于大多数其他设备。

详情

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

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

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

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

你可以做的是:

  • 切勿在ListView/ListBox 中使用Click 事件,而是使用PreviewMouseDown

【讨论】:

  • 这绝对是WPF的bug。
  • 我们可以在UWP中使用ItemClick。
【解决方案3】:

我知道这个问题已经很老了,但也许其他人来这里寻找解决这个问题的方法,比如我。 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 事件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    • 2010-11-08
    相关资源
    最近更新 更多