Штрихи чернил не отображаются в 50% случаев при нанесении чернил на элемент управления InkCanvas с помощью стилуса

#.net #wpf

#.net #wpf

Вопрос:

Чего я пытаюсь достичь

Я хотел бы разрешить пользователям рисовать поверх элемента управления (надпись, выпадающий список, текстовое поле и т.д.), переводить штрихи чернил в текст и вводить текст в элемент управления. Чернила будут захвачены путем вывода элемента управления InkCanvas на передний план при нажатии на элемент управления с помощью мыши / стилуса. При поднятии мыши / стилуса InkCanvas возвращается в фоновый режим.

Проблема

Это всегда работает должным образом при использовании мыши. При использовании пера штрихи чернил иногда не отображаются на InkCanvas до тех пор, пока стилус не будет поднят. Он работает корректно примерно в 50% случаев.

Проект

Я создал простой проект WPF, который содержит единственное окно с элементом управления InkCanvas и меткой. При нажатии на метку InkCanvas выходит на передний план и начинает принимать ввод чернил. InkCanvas возвращается в фоновый режим при наведении курсора мыши.

XAML

 <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="409" Width="824" WindowStartupLocation="CenterScreen">
<Grid>
    <InkCanvas IsHitTestVisible="False" Panel.ZIndex="0" Background="Aqua" Name="InkContainer"  />
    <Label Content="INK ON ME" Height="60" HorizontalAlignment="Left" Margin="424,146,0,0" Name="Label1" VerticalAlignment="Top" Width="254" FontSize="36" Foreground="White" FontWeight="Bold" />
</Grid>
  

Код, лежащий в основе

 Class MainWindow

Private Sub InkContainer_PreviewMouseUp(sender As System.Object, e As System.Windows.Input.MouseButtonEventArgs) Handles InkContainer.PreviewMouseUp

    Canvas.SetZIndex(InkContainer, -1)
    InkContainer.IsHitTestVisible = False

End Sub

Private Sub Label1_PreviewMouseDown(sender As System.Object, e As System.Windows.Input.MouseButtonEventArgs) Handles Label1.PreviewMouseDown

    InkContainer.Strokes.Clear()
    Canvas.SetZIndex(InkContainer, 100)
    InkContainer.IsHitTestVisible = True
    InkContainer.CaptureMouse()

End Sub

End Class
  

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

Ответ №1:

Исправление заключается в том, чтобы пометить событие «стилус вниз» как обработанное, чтобы оно не всплывало и не запускало другие события «стилус / мышь». Вот обновленный код, лежащий в основе:

 Class MainWindow 

Private Sub Label1_PreviewMouseDown(sender As System.Object, e As System.Windows.Input.MouseButtonEventArgs) Handles Label1.PreviewMouseDown

    InkContainer.Strokes.Clear()
    Canvas.SetZIndex(InkContainer, 100)
    InkContainer.IsHitTestVisible = True
    InkContainer.CaptureStylus()

End Sub

Private Sub Label1_PreviewStylusDown(sender As System.Object, e As System.Windows.Input.StylusDownEventArgs) Handles Label1.PreviewStylusDown

    InkContainer.Strokes.Clear()
    Canvas.SetZIndex(InkContainer, 100)
    InkContainer.IsHitTestVisible = True
    InkContainer.CaptureStylus()

    e.Handled = True

End Sub

Private Sub InkContainer_PreviewMouseUp(sender As System.Object, e As System.Windows.Input.MouseButtonEventArgs) Handles InkContainer.PreviewMouseUp

    Canvas.SetZIndex(InkContainer, -1)
    InkContainer.IsHitTestVisible = False

End Sub

End Class