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