VB.net WPF :: Touchscreen не запускает последовательно Click () или другие события мыши - PullRequest
0 голосов
/ 27 ноября 2018

Я смотрю на проблему, когда элементы управления сенсорного экрана странно вели себя на самодельной цифровой клавиатуре.Существует два варианта этой цифровой панели: один - поле для ввода пароля, другой - для обычных (видимых) числовых вводов.

Сам проект довольно сложен, и используется много разных окон.

И пароль, и числовое окно прекрасно работают при вызове из главного окна, однако, когда цифровая клавиатура (или поле пароля, я пробовал оба) вызывается из окон, расположенных дальше по программе, все становится немного странно .

Проблема возникает в Windows 10 (компьютер разработчика) и Windows 7 (активный компьютер).

Описание проблемы:

При попытке нажатия кнопок события нажатия кнопки не реагируют. После их многократного нажатия кнопки в конечном итоге начнут функционировать, как и предполагалось.Как только кнопки функционируют, они остаются работоспособными, пока окно не закроется.Нет никакой разницы из-за времени нажатия, движений, ...

Окно отлично работает при использовании мыши.

Мне нужна программа, чтобы она работалас помощью сенсорной панели и мыши (хотя, конечно, не одновременно).

То, что я пробовал:

  • Обработка касаниясобытие в окне и использование координат положения, чтобы решить, какая кнопка была бы нажата.

Это работает, но только для сенсорного экрана.Кнопки по-прежнему не реагируют активно, но код, стоящий за событием касания, функционирует должным образом.

Это, однако, нарушает использование мыши.

  • Обработка TouchDown и MouseLeftButtonDown через координаты положения

Отлично работает для мыши, работает для сенсорного экрана ... , пока сенсорный экран не начнет срабатывать дважды вкл.каждая кнопка, которая нажата .Сенсорный экран одновременно вызывает событие TouchDown, а также событие MouseLeftButtonDown.То же самое применяется, как и ранее, как только он начинает срабатывать дважды, он продолжает срабатывать дважды.

  • Обработка MouseLeftButtonDown через координаты позиции, игнорируя TouchDown

Точно такое же поведение, каксобытия нажатия кнопки по умолчанию.Сенсорный экран не работает должным образом, пока он не работает, и после его работы он продолжает работать как положено.

  • Вызов Mouse.Synchronise () в обработчике событий TouchDown или PreviewTouchDown

Увидел этокак решение для аналогичного (но, хотя и другого) вопроса, с моей стороны ничего не решено.

  • Установка e.Handled = true для перехваченных обработчиков Touchdown и MouseLeftButtonDown

То же поведение, что и в оригинальном случае.

  • IsManipulationEnabled = "true" для задействованных элементов

Ничего не изменилось.

Код:

  • Дизайнер:

    <Window x:Class="NumericKeyPad"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:REDACTEDNAME"
        mc:Ignorable="d"
        Title="NumericKeyPad" Height="400" Width="400">
    <DockPanel Name="DockPanel" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" PreviewMouseLeftButtonDown="NumericKeyPad_MouseLeftButtonDown">
       <Grid>
        <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
            <Grid.RowDefinitions>
                <RowDefinition Height="10*"></RowDefinition>
                <RowDefinition Height="10*"></RowDefinition>
                <RowDefinition Height="10*"></RowDefinition>
                <RowDefinition Height="10*"></RowDefinition>
                <RowDefinition Height="10*"></RowDefinition>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="73*"></ColumnDefinition>
                <ColumnDefinition Width="7*"></ColumnDefinition>
                <ColumnDefinition Width="66*"/>
                <ColumnDefinition Width="73*"></ColumnDefinition>
                <ColumnDefinition Width="73*"></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <TextBlock Name="Textblock" FontSize="24" HorizontalAlignment="Stretch" VerticalAlignment="Center" TextWrapping="Wrap" Text="" Margin="10,10,30,0" TextAlignment="Center" Grid.ColumnSpan="5"/>
            <Button Content="1" FontSize="20" HorizontalAlignment="Stretch"  Margin="0,0,0,0" VerticalAlignment="Stretch"  HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Grid.Row="1" Grid.Column="0"  />
            <Button Content="2" FontSize="20" HorizontalAlignment="Stretch"  Margin="0,0,0,0" VerticalAlignment="Stretch"  HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Grid.Row="1" Grid.Column="1"  Grid.ColumnSpan="2"/>
            <Button Content="3" FontSize="20" HorizontalAlignment="Stretch"  Margin="0,0,0,0" VerticalAlignment="Stretch"  HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Grid.Row="1" Grid.Column="3" />
            <Button Content="4" FontSize="20" HorizontalAlignment="Stretch"  Margin="0,0,0,0" VerticalAlignment="Stretch"  HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Grid.Row="2" Grid.Column="0" />
            <Button Content="5" FontSize="20" HorizontalAlignment="Stretch"  Margin="0,0,0,0" VerticalAlignment="Stretch"  HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Grid.Row="2" Grid.Column="1"  Grid.ColumnSpan="2"/>
            <Button Content="6" FontSize="20" HorizontalAlignment="Stretch"  Margin="0,0,0,0" VerticalAlignment="Stretch"  HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Grid.Row="2" Grid.Column="3" />
            <Button Content="7" FontSize="20" HorizontalAlignment="Stretch"  Margin="0,0,0,0" VerticalAlignment="Stretch"  HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Grid.Row="3" Grid.Column="0" />
            <Button Content="8" FontSize="20" HorizontalAlignment="Stretch"  Margin="0,0,0,0" VerticalAlignment="Stretch"  HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Grid.Row="3" Grid.Column="1"  Grid.ColumnSpan="2"/>
            <Button Content="9" FontSize="20" HorizontalAlignment="Stretch"  Margin="0,0,0,0" VerticalAlignment="Stretch"  HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Grid.Row="3" Grid.Column="3" />
            <Button Content="0" FontSize="20" HorizontalAlignment="Stretch"  Margin="0,0,0,0" VerticalAlignment="Stretch"  HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Grid.Row="4" Grid.Column="0"  Grid.ColumnSpan="3"  />
            <Button Content="," FontSize="20" HorizontalAlignment="Stretch"  Margin="0,0,0,0" VerticalAlignment="Stretch"  HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Grid.Row="4" Grid.Column="3" />
    
            <Button Content="Back" FontSize="16" HorizontalAlignment="Stretch"  Margin="0,0,0,0" VerticalAlignment="Stretch"  HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Grid.Row="1" Grid.Column="4" Grid.RowSpan="2" />
            <Button Content="Enter" FontSize="16" HorizontalAlignment="Stretch"  Margin="0,0,0,0" VerticalAlignment="Stretch"  HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Grid.Row="3" Grid.Column="4" Grid.RowSpan="2" />
        </Grid>
    
    </Grid> 
    </DockPanel>
    

  • Код:

    Public Class NumericKeyPad
    Public Property NewValue As String
    
    Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
        Try
            Dim btn As Button = CType(sender, Button)
            NewValue = NewValue + btn.Content.ToString()
            Textblock.Text = NewValue
        Catch ex As Exception
            Worker.WriteLog("NumericKeyPad : Button_Click : " & ex.ToString(), "erro")
        End Try
    
    End Sub
    
    Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs)
        Try
    
            Textblock.Text = NewValue
        Catch ex As Exception
            Worker.WriteLog("NumericKeyPad : Window_Loaded : " & ex.ToString(), "erro")
        End Try
    End Sub
    
    Private Sub ButtonBack_Click(sender As Object, e As RoutedEventArgs)
        Try
            If (NewValue.Length > 0) Then
                NewValue = NewValue.Substring(0, NewValue.Length - 1)
                Textblock.Text = NewValue
            End If
    
        Catch ex As Exception
            Worker.WriteLog("NumericKeyPad : ButtonBack_Click : " & ex.ToString(), "erro")
        End Try
    End Sub
    
    Private Sub ButtonEnter_Click(sender As Object, e As RoutedEventArgs)
        Try
            Me.Close()
        Catch ex As Exception
            Worker.WriteLog("NumericKeyPad : ButtonEnter_Click : " & ex.ToString(), "erro")
        End Try
    End Sub
    
    Private Sub Textblock_IsVisibleChanged(sender As Object, e As DependencyPropertyChangedEventArgs) Handles Textblock.IsVisibleChanged
        Try
            Textblock.Text = NewValue
        Catch ex As Exception
            Worker.WriteLog("NumericKeyPad : Textblock_IsVisibleChanged : " & ex.ToString(), "erro")
        End Try
    End Sub
    
    Private Sub NumericKeyPad_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
        Try
            Me.Focus()
        Catch ex As Exception
            Worker.WriteLog("NumericKeyPad : NumericKeyPad_Loaded : " & ex.ToString(), "erro")
        End Try
    End Sub
    
    
    
    Private Sub NumericKeyPad_TouchDown(sender As Object, e As TouchEventArgs) Handles Me.TouchDown
        Try
            Dim position As Point = e.GetTouchPoint(Me.DockPanel).Position
    
            HandlePoint(position)
    
        Catch ex As Exception
            Worker.WriteLog("NumericKeyPad : NumericKeyPad_TouchDown : " & ex.ToString(), "erro")
        End Try
    
    End Sub
    
    Private Sub NumericKeyPad_MouseLeftButtonDown(sender As Object, e As MouseButtonEventArgs)
        'Try
        '    Dim position As Point = e.GetPosition(Me.DockPanel)
    
        '    HandlePoint(position)
    
        'Catch ex As Exception
        '    Worker.WriteLog("NumericKeyPad : NumericKeyPad_MouseLeftButtonDown : " & ex.ToString(), "erro")
        'End Try
    End Sub
    
    Private Sub HandlePoint(position As Point)
        Try
    
            Debug.WriteLine("position : " & position.X & " , " & position.Y)
    
            'determine where the touch event happened
    
            Dim place As String = ""
    
            Dim width As Double = Me.DockPanel.ActualWidth
            Dim height As Double = Me.DockPanel.ActualHeight
    
            'determine row
            Dim section As Double = height / 5.0
            Dim sectionCol As Double = width / 4.0
    
            Select Case True
                Case position.Y >= 0 And position.Y <= section 'Row 0
                    place = "textfield"
                Case position.Y > section And position.Y <= section * 2 '1-2-3-BACK
                    Select Case True
                        Case position.X >= 0 And position.X <= sectionCol 'Col 0
                            place = "1"
                        Case position.X > sectionCol And position.X <= sectionCol * 2 'Col 1
                            place = "2"
                        Case position.X > sectionCol * 2 And position.X <= sectionCol * 3 'Col 2
                            place = "3"
                        Case position.X > sectionCol * 3 And position.X <= sectionCol * 4 'Col 3
                            place = "bckspce"
                    End Select
    
                Case position.Y > section * 2 And position.Y <= section * 3 '4-5-6-BACK
                    Select Case True
                        Case position.X >= 0 And position.X <= sectionCol
                            place = "4"
                        Case position.X > sectionCol And position.X <= sectionCol * 2
                            place = "5"
                        Case position.X > sectionCol * 2 And position.X <= sectionCol * 3
                            place = "6"
                        Case position.X > sectionCol * 3 And position.X <= sectionCol * 4
                            place = "bckspce"
                    End Select
    
                Case position.Y > section * 3 And position.Y <= section * 4 '7-8-9-Ent
                    Select Case True
                        Case position.X >= 0 And position.X <= sectionCol
                            place = "7"
                        Case position.X > sectionCol And position.X <= sectionCol * 2
                            place = "8"
                        Case position.X > sectionCol * 2 And position.X <= sectionCol * 3
                            place = "9"
                        Case position.X > sectionCol * 3 And position.X <= sectionCol * 4
                            place = "entr"
                    End Select
    
                Case position.Y > section * 4 And position.Y <= section * 5 'NULL-cma-Ent
                    Select Case True
                        Case position.X >= 0 And position.X <= sectionCol
                            place = "0"
                        Case position.X > sectionCol And position.X <= sectionCol * 2
                            place = "0"
                        Case position.X > sectionCol * 2 And position.X <= sectionCol * 3
                            place = "cmma"
                        Case position.X > sectionCol * 3 And position.X <= sectionCol * 4
                            place = "entr"
                    End Select
            End Select
    
            Select Case place
                Case "0"
                    NewValue = NewValue + "0"
                    Textblock.Text = NewValue
                Case "1"
                    NewValue = NewValue + "1"
                    Textblock.Text = NewValue
                Case "2"
                    NewValue = NewValue + "2"
                    Textblock.Text = NewValue
                Case "3"
                    NewValue = NewValue + "3"
                    Textblock.Text = NewValue
                Case "4"
                    NewValue = NewValue + "4"
                    Textblock.Text = NewValue
                Case "5"
                    NewValue = NewValue + "5"
                    Textblock.Text = NewValue
                Case "6"
                    NewValue = NewValue + "6"
                    Textblock.Text = NewValue
                Case "7"
                    NewValue = NewValue + "7"
                    Textblock.Text = NewValue
                Case "8"
                    NewValue = NewValue + "8"
                    Textblock.Text = NewValue
                Case "9"
                    NewValue = NewValue + "9"
                    Textblock.Text = NewValue
                Case "entr"
                    Me.Close()
                Case "bckspce"
                    If (NewValue.Length > 0) Then
                        NewValue = NewValue.Substring(0, NewValue.Length - 1)
                        Textblock.Text = NewValue
                    End If
                Case "cmma"
                    NewValue = NewValue + ","
                    Textblock.Text = NewValue
                Case Else
                    'Do nothing
            End Select
        Catch ex As Exception
            Worker.WriteLog("NumericKeyPad : HandlePoint : " & ex.ToString(), "erro")
        End Try
    End Sub
    

У кого-нибудь есть какие-либо подсказки относительно того, что вызывает это и как это исправить?

Заранее спасибо,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...