带触摸屏的 WPF,列表框打开模式 window 没有响应

WPF with touchscreen, listbox opens a modal window doesn't respond

我遇到了一些问题 weeks/months,我希望有人能帮助我 ;) 此 WPF 问题仅在通过触摸屏使用时出现,使用鼠标时效果很好。 重现的概念非常简单: - 1 window 带有列表框或列表视图 - 你用简单的项目填充列表(例如只是一个文本) - 第二个 window 带有 2 个或更多简单按钮

当您通过触摸屏 select window 1 中列表中的一个项目时,它会以模态模式 (ShowDialog) 打开第二个 window。当第二个 window 打开时,您无法在第一次触摸时触摸任何按钮! 如果你用鼠标做同样的事情,它工作正常!当您调用 window 2 ShowDialog 时,触摸事件似乎没有完成(当它不是模态时它工作正常:使用 Show)。

这里是XAML window 1:

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="500" Width="661" WindowStartupLocation="CenterScreen">
    <StackPanel>
        <ListView x:Name="lstItems" Height="300" Margin="10,10,20,10" Width="Auto" ItemsSource="{Binding}" BorderBrush="{x:Null}"
                         SelectionMode="Single"  Visibility="Visible" ScrollViewer.VerticalScrollBarVisibility="Hidden">
        </ListView>
    </StackPanel>
</Window>

这里是 window 1:

背后的代码
Class MainWindow
    Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
        With lstItems
            .Items.Clear()
            For i = 0 To 50
                .Items.Add("test #" & i.ToString)
            Next
        End With
    End Sub

    Private Sub lstItems_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles lstItems.SelectionChanged
        Dim _frm As frm2 = New frm2
        _frm.ClickedItem = lstItems.SelectedItem.ToString
        _frm.ShowDialog()
        _frm.Close()
        _frm = Nothing
    End Sub

End Class

这里是window2xaml:

<Window x:Class="frm2"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="frm2" Height="393" Width="661" WindowStartupLocation="CenterScreen">
    <Grid>
        <UniformGrid Columns="2">
            <Button x:Name="cmdbutton1" Height="128" Content="Button1"/>
            <Button x:Name="cmdbutton2" Height="128" Content="Button2"/>
        </UniformGrid>
    </Grid>
</Window>

这里是 window 2:

背后的代码
Public Class frm2
    Property ClickedItem As String = ""

    Private Sub frm2_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
        Me.Title = ClickedItem
    End Sub

    Private Sub cmdbutton1_Click(sender As Object, e As RoutedEventArgs) Handles cmdbutton1.Click
        Me.Close()
    End Sub

    Private Sub cmdbutton2_Click(sender As Object, e As RoutedEventArgs) Handles cmdbutton2.Click
        Me.Close()
    End Sub
End Class

提前感谢您的帮助...

这个问题在 Microsoft KB 中被引用,自 .NET 4.5.1 以来它已被标记为已解决,无论如何它不是因为我可以轻松重现它... 我刚刚在这里找到了解决方法:

直接替换原代码:

    Private Sub lstItems_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles lstItems.SelectionChanged
    Dim _frm As frm2 = New frm2
    _frm.ClickedItem = lstItems.SelectedItem.ToString
    _frm.ShowDialog()
    _frm.Close()
    _frm = Nothing
End Sub

有了这个:

    Private Sub lstItems_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles lstItems.SelectionChanged

            Dispatcher.BeginInvoke(Sub()

    Dim _frm As frm2 = New frm2
    _frm.ClickedItem = lstItems.SelectedItem.ToString
    _frm.ShowDialog()
    _frm.Close()
    _frm = Nothing

结束子) 万一 结束子

解决方案在这里,您刚刚在 Async 中声明了您的 sub 并执行任务等待...

      Private Async Sub lstItems_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles lstItems.SelectionChanged

Await Task.Delay(1)

    Dim _frm As frm2 = New frm2
    _frm.ClickedItem = lstItems.SelectedItem.ToString
    _frm.ShowDialog()
    _frm.Close()
    _frm = Nothing
Dispatcher.BeginInvoke 中的

ShowDialog 对我有用。它有点慢,但至少可以工作。如果您从 TouchUp 事件打开对话框,情况相同,但如果您从按钮的 Click 事件打开,则很好。奇怪的错误。