簡體   English   中英

帶觸摸屏的WPF,列表框打開模態窗口不響應

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

我有幾個星期/幾個月我面臨一個問題,我希望有人可以幫助我;)這個WPF問題只有在通過觸摸屏使用時才會出現,它可以正常使用鼠標。 重現的概念非常簡單: - 1個帶有列表框或列表視圖的窗口 - 用簡單項目填充列表(例如只有文本) - 帶有2個或更多簡單按鈕的第二個窗口

當您通過觸摸屏在窗口1的列表中選擇項目時,它將以模態模式(ShowDialog)打開第二個窗口。 當第二個窗口打開時,您無法在第一次觸摸時觸摸任何按鈕! 如果你用鼠標做同樣的事情它工作正常! 當你調用窗口2 ShowDialog時,看起來觸摸事件沒有完成(當它不是模態時它工作正常:使用Show)。

這里是XAML窗口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>

這里是窗口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

窗口2 xaml:

<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>

這里是窗口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

預先感謝您的幫助...

解決方案就在這里,您只需在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

這個問題在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

End Sub)End If End Sub

Dispatcher.BeginInvoke ShowDialog為我工作。 它有點慢,但至少工作。 如果你從TouchUp事件中打開對話框,它也是一樣的,但如果你從按鈕的Click事件打開,那就很好了。 奇怪的錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM