InkCanvas
40WPF --- Основа WPF --- InkCanvas
В WPF также имеется элемент InkCanvas, который подобен Canvas в одних отношениях и совершенно отличается в других. Подобно Canvas, элемент InkCanvas определяет четыре присоединенных свойства, которые можно применить к дочерним элементам для координатного позиционирования (Top, Left, Bottom и Right). Однако лежащий в его основе механизм существенно отличается. Фактически InkCanvas не наследуется от Canvas, и даже не наследуется от базового класса Panel. Вместо этого он наследуется непосредственно от FrameworkElement.
Главное предназначение InkCanvas заключается в обеспечении перьевого ввода. Перо (stylus) — это подобное карандашу устройство ввода, используемое в планшетных ПК. Однако InkCanvas работает с мышью точно так же, как и с пером. Поэтому пользователь может рисовать линии или выбирать и манипулировать элементами в InkCanvas с применением мыши.
InkCanvas в действительности содержит две коллекции дочернего содержимого. Уже знакомая коллекция Children содержит произвольные элементы — как и Canvas. Каждый элемент может быть позиционирован на основе свойств Top, Left, Bottom и Right. Коллекция Strokes содержит объекты System.Windows.Ink.Stroke, представляющие графический ввод, который рисует пользователь в InkCanvas. Каждая нарисованная линия или кривая становится отдельным объектом Stroke. Благодаря этим двум коллекциям, InkCanvas можно использовать для того, чтобы позволить пользователю аннотировать содержимое (хранящееся в коллекции Children) пометками (хранящимися в коллекции Strokes). Например:
<InkCanvas EditingMode="Ink">
<Image Source="auto.jpg" InkCanvas.Top="10" InkCanvas.Left="10"></Image>
</InkCanvas>
Пометки нарисованы пользователем во время выполнения. InkCanvas может применяться несколькими существенно отличающимися способами, в зависимости от значения, которое устанавливается для свойства EditingMode. Возможные варианты этого значения перечислены ниже:
- Ink
InkCanvas позволяет пользователю рисовать аннотации. Это режим по умолчанию. Когда пользователь рисует мышью или пером, появляются штрихи
- GestureOnly
InkCanvas не позволяет пользователю рисовать аннотации, но привлекает внимание к некоторым предопределенным жестам (gesture), таким как перемещение пера в одном направлении или подчеркивание содержимого. Полный список жестов определен в перечислении System.Windows.Ink.ApplicationGesture
- InkAndGesture
InkCanvas позволяет пользователю рисовать штриховые аннотации и также распознает предопределенные жесты
- EraseByStroke
InkCanvas удаляет штрих при щелчке. Если у пользователя есть перо, он может переключиться в этот режим, используя его обратный конец. (Определить текущий режим можно, проверив значение доступного только для чтения свойства ActiveEditingMode, а для изменения режима, используемого обратным концом пера, необходимо модифицировать свойство EditingModeInverted.)
- EraseByPoint
InkCanvas удаляет часть штриха (точку штриха) при щелчке на соответствующей его части
- Select
InkCanvas позволяет пользователю выбирать элементы, хранящиеся в коллекции Children. Чтобы выбрать элемент, пользователь должен щелкнуть на нем или обвести "лассо" выбора вокруг него. Как только элемент выбран, его можно перемещать, изменять размер или удалять
- None
InkCanvas игнорирует ввод с помощью мыши или пера
InkCanvas инициирует события при изменении режима редактирования (ActiveEditingModeChanged), обнаружении жеста в режимах GestureOnly или InkAndGesture (Gesture), рисовании штриха (StrokeCollected), стирании штриха (StrokeErasing и StrokeErased), а также при выборе элемента или изменении его в режиме Select (SelectionChanging, SelectionChanged, SelectionMoving, SelectionMoved, SelectionResizing и SelectlonResized). События, оканчивающиеся на ing, представляют действие, которое начинается, но может быть отменено установкой свойства Cancel объекта EventArgs.
В режиме Select элемент InkCanvas предоставляет довольно удобную поверхность проектирования для перетаскивания содержимого и различных манипуляций им. Ниже показан элемент управления Button в InkCanvas, когда он был выбран и затем увеличен: