带触摸屏的 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
事件打开,则很好。奇怪的错误。
我遇到了一些问题 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
事件打开,则很好。奇怪的错误。