Сбор данных рукописного ввода
Платформа Windows Presentation Foundation выполняет сбор цифровых рукописных фрагментов, что является одной из основных ее функций. В этой теме обсуждаются методы сбора данных рукописного ввода в Windows Presentation Foundation (WPF).
Необходимые компоненты
Чтобы использовать следующие примеры, сначала необходимо установить Visual Studio и пакет SDK для Windows. Кроме того, необходимо иметь представление о создании приложений для WPF. Дополнительные сведения о начале работы с WPF см. в разделах Пошаговое руководство. Создание первого классического приложения WPF.
Использование элемента InkCanvas
Элемент System.Windows.Controls.InkCanvas обеспечивает самый простой способ сбора данных рукописного ввода в WPF. Элемент InkCanvas можно использовать для получения и отображения данных рукописного ввода. Рукописный ввод, как правило, осуществляется с помощью пера, которое взаимодействует с дигитайзером для создания рукописных штрихов. Кроме того, вместо пера можно использовать мышь. Созданные штрихи представляются в виде объектов Stroke, и ими можно управлять программно или с помощью пользовательского ввода. InkCanvas позволяет пользователям выбирать, изменять и удалять существующие Stroke.
С помощью XAML можно настроить сбор рукописных фрагментов, просто добавив элемент InkCanvas в дерево. В следующем примере InkCanvas добавляется в проект WPF по умолчанию, созданный в Visual Studio:
<Grid>
<InkCanvas/>
</Grid>
Элемент InkCanvas также может содержать дочерние элементы, что позволяет добавлять функции рукописных заметок практически в любые элементы XAML. Например, чтобы добавить возможности рукописного ввода в текстовый элемент, просто сделайте его дочерним элементом InkCanvas.
<InkCanvas>
<TextBlock>Show text here.</TextBlock>
</InkCanvas>
Добавление поддержки пометки изображений с помощью рукописного ввода выполняется так же просто.
<InkCanvas>
<Image Source="myPicture.jpg"/>
</InkCanvas>
Режимы InkCollection
InkCanvas обеспечивает поддержку различных режимов ввода с помощью свойства EditingMode.
Управление рукописным вводом
InkCanvas предоставляет поддержку различных операций редактирования рукописных фрагментов. Например, InkCanvas поддерживает режим ластика без необходимости написания дополнительного кода для добавления этой функции в элемент.
Выбор
Настроить режим выбора так же просто, как и настроить свойство InkCanvasEditingMode со значением Select.
Следующий код устанавливает режим редактирования на основе значения CheckBox.
// Set the selection mode based on a checkbox
if ((bool)cbSelectionMode.IsChecked)
{
theInkCanvas.EditingMode = InkCanvasEditingMode.Select;
}
else
{
theInkCanvas.EditingMode = InkCanvasEditingMode.Ink;
}
' Set the selection mode based on a checkbox
If CBool(cbSelectionMode.IsChecked) Then
theInkCanvas.EditingMode = InkCanvasEditingMode.Select
Else
theInkCanvas.EditingMode = InkCanvasEditingMode.Ink
End If
DrawingAttributes
Используйте свойство DrawingAttributes для изменения внешнего вида штрихов рукописного ввода. Например, член ColorDrawingAttributes задает цвет отрисованного объекта Stroke.
В следующем примере цвет выбранных штрихов изменяется на красный.
// Get the selected strokes from the InkCanvas
StrokeCollection selection = theInkCanvas.GetSelectedStrokes();
// Check to see if any strokes are actually selected
if (selection.Count > 0)
{
// Change the color of each stroke in the collection to red
foreach (System.Windows.Ink.Stroke stroke in selection)
{
stroke.DrawingAttributes.Color = System.Windows.Media.Colors.Red;
}
}
' Get the selected strokes from the InkCanvas
Dim selection As StrokeCollection = theInkCanvas.GetSelectedStrokes()
' Check to see if any strokes are actually selected
If selection.Count > 0 Then
' Change the color of each stroke in the collection to red
Dim stroke As System.Windows.Ink.Stroke
For Each stroke In selection
stroke.DrawingAttributes.Color = System.Windows.Media.Colors.Red
Next stroke
End If
DefaultDrawingAttributes
Свойство DefaultDrawingAttributes предоставляет доступ к свойствам, таким как высота, ширина и цвет штрихов, создаваемых в InkCanvas. После изменения DefaultDrawingAttributes все штрихи, которые в будущем будут вводиться в InkCanvas, отрисовываются с использованием новых значений свойства.
Помимо изменения DefaultDrawingAttributes в файле кода программной части, можно использовать синтаксис XAML для указания свойств DefaultDrawingAttributes.
В следующем примере кода показано, как установить свойство Color. Чтобы воспользоваться этим кодом, создайте новый проект WPF с именем HelloInkCanvas в Visual Studio. Замените код в файле MainWindow.xaml следующим кодом.
<Window x:Class="HelloInkCanvas.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Ink="clr-namespace:System.Windows.Ink;assembly=PresentationCore"
Title="Hello, InkCanvas!" Height="300" Width="300"
>
<Grid>
<InkCanvas Name="inkCanvas1" Background="Ivory">
<InkCanvas.DefaultDrawingAttributes>
<Ink:DrawingAttributes xmlns:ink="system-windows-ink" Color="Red" Width="5" />
</InkCanvas.DefaultDrawingAttributes>
</InkCanvas>
<!-- This stack panel of buttons is a sibling to InkCanvas (not a child) but overlapping it,
higher in z-order, so that ink is collected and rendered behind -->
<StackPanel Name="buttonBar" VerticalAlignment="Top" Height="26" Orientation="Horizontal" Margin="5">
<Button Click="Ink">Ink</Button>
<Button Click="Highlight">Highlight</Button>
<Button Click="EraseStroke">EraseStroke</Button>
<Button Click="Select">Select</Button>
</StackPanel>
</Grid>
</Window>
Затем добавьте следующие обработчики событий кнопки в файл кода программной части внутри класса MainWindow.
// Set the EditingMode to ink input.
private void Ink(object sender, RoutedEventArgs e)
{
inkCanvas1.EditingMode = InkCanvasEditingMode.Ink;
// Set the DefaultDrawingAttributes for a red pen.
inkCanvas1.DefaultDrawingAttributes.Color = Colors.Red;
inkCanvas1.DefaultDrawingAttributes.IsHighlighter = false;
inkCanvas1.DefaultDrawingAttributes.Height = 2;
}
// Set the EditingMode to highlighter input.
private void Highlight(object sender, RoutedEventArgs e)
{
inkCanvas1.EditingMode = InkCanvasEditingMode.Ink;
// Set the DefaultDrawingAttributes for a highlighter pen.
inkCanvas1.DefaultDrawingAttributes.Color = Colors.Yellow;
inkCanvas1.DefaultDrawingAttributes.IsHighlighter = true;
inkCanvas1.DefaultDrawingAttributes.Height = 25;
}
// Set the EditingMode to erase by stroke.
private void EraseStroke(object sender, RoutedEventArgs e)
{
inkCanvas1.EditingMode = InkCanvasEditingMode.EraseByStroke;
}
// Set the EditingMode to selection.
private void Select(object sender, RoutedEventArgs e)
{
inkCanvas1.EditingMode = InkCanvasEditingMode.Select;
}
После копирования этого кода нажмите клавишу F5 в Visual Studio для запуска программы в отладчике.
Обратите внимание, что StackPanel размещает кнопки поверх InkCanvas. При попытке рукописного ввода поверх кнопок InkCanvas собирает и отображает рукописные данные позади кнопок. Это происходит потому, что кнопки являются элементами одного уровня с InkCanvas, а не дочерними элементами. Кроме того, кнопки находятся выше в z-порядке, поэтому рукописные фрагменты отображаются позади них.
См. также
.NET Desktop feedback