背水一战 Windows 10 (61) - 控件(媒体类): InkCanvas 涂鸦编辑
生活随笔
收集整理的這篇文章主要介紹了
背水一战 Windows 10 (61) - 控件(媒体类): InkCanvas 涂鸦编辑
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
背水一戰(zhàn) Windows 10 (61) - 控件(媒體類): InkCanvas 涂鴉編輯 原文:背水一戰(zhàn) Windows 10 (61) - 控件(媒體類): InkCanvas 涂鴉編輯
[源碼下載]
作者:webabcd
介紹
背水一戰(zhàn) Windows 10 之 控件(媒體類)
- InkCanvas 涂鴉編輯
示例
演示?InkCanvas 涂鴉板編輯相關(guān)的操作
Controls/MediaControl/InkCanvasDemo2.xaml
Controls/MediaControl/InkCanvasDemo2.xaml.cs
/** InkCanvas - 涂鴉板控件(繼承自 FrameworkElement, 請參見 /Controls/BaseControl/FrameworkElementDemo/)* InkPresenter - 獲取 InkPresenter 對象* * InkPresenter - 涂鴉板* StrokeContainer - 返回 InkStrokeContainer 類型的對象* InputProcessingConfiguration.RightDragAction - 涂鴉的輸入按鍵* AllowProcessing - 所有按鍵均可用于涂鴉,比如鼠標(biāo)的左鍵和右鍵均可用于涂鴉。默認(rèn)值* LeaveUnprocessed - 特殊按鍵不可用于涂鴉,比如鼠標(biāo)的右鍵不可用于涂鴉* UnprocessedInput - 用于監(jiān)聽指針的一些事件* PointerEntered, PointerExited, PointerHovered, PointerLost, PointerMoved, PointerPressed, PointerReleased - 顧名思義的一些事件* 注:當(dāng) InputProcessingConfiguration.RightDragAction 為 AllowProcessing 時(shí),則只會觸發(fā) PointerEntered, PointerExited, PointerHovered 事件* SetPredefinedConfiguration(InkPresenterPredefinedConfiguration value) - 設(shè)置涂鴉行為(SimpleSinglePointer - 單接觸點(diǎn)涂鴉; SimpleMultiplePointer - 多接觸點(diǎn)涂鴉)* StrokesCollected - 當(dāng)一個(gè)或多個(gè) InkStroke 被畫進(jìn)來時(shí)觸發(fā)的事件* StrokesErased - 當(dāng)一個(gè)或多個(gè) InkStroke 被擦除時(shí)觸發(fā)的事件* StrokeInput - 用于監(jiān)聽一些涂鴉事件* StrokeStarted, StrokeEnded, StrokeContinued, StrokeCanceled - 顧名思義的一些事件* * InkStrokeContainer - 用于管理涂鴉* GetStrokes() - 獲取當(dāng)前涂鴉板的所有 InkStroke 對象集合* BoundingRect - 獲取當(dāng)前涂鴉板的所有 InkStroke 對象的 Rect 區(qū)域* Clear() - 清除所有涂鴉* SelectWithLine(Point from, Point to) - 返回指定對角線內(nèi)的涂鴉所在的 Rect 區(qū)域* SelectWithPolyLine(IEnumerable<Point> polyline) - 返回指定 Polyline 內(nèi)的涂鴉所在的 Rect 區(qū)域* CopySelectedToClipboard() - 復(fù)制選中的涂鴉到剪切板* CanPasteFromClipboard() - 剪切板中是否有涂鴉數(shù)據(jù)* PasteFromClipboard(Point position) - 從剪切板粘貼涂鴉到指定的位置,并返回粘貼涂鴉的 Rect 區(qū)域* MoveSelected(Point translation) - 指定偏移量,并移動選中的涂鴉,返回的是移動后的涂鴉的 Rect 區(qū)域* DeleteSelected() - 刪除選中的涂鴉,并返回刪除涂鴉的 Rect 區(qū)域* AddStroke(InkStroke stroke) - 在涂鴉板上繪制指定的 InkStroke 對象* AddStrokes(IEnumerable<InkStroke> strokes) - 在涂鴉板上繪制指定的 InkStroke 對象集合* * InkStroke - 涂鴉對象(這是一次的涂鴉對象,即鼠標(biāo)按下后移動然后再抬起后所繪制出的涂鴉)* BoundingRect - 獲取當(dāng)前 InkStroke 的 Rect 區(qū)域* DrawingAttributes - 涂鴉筆尖屬性(參見 InkCanvasDemo1.xaml.cs)* PointTransform - 用于轉(zhuǎn)換 InkStroke 的 Matrix3x2 仿射轉(zhuǎn)換矩陣(Matrix3x2 提供了一些簡便的方法:CreateRotation, CreateScale, CreateSkew, CreateTranslation 等)* Selected - 是否被選中* Clone() - 克隆一份,返回克隆后的 InkStroke 對象* GetInkPoints(), GetRenderingSegments() - 用于獲取組成 InkStroke 的一堆貝塞爾曲線的數(shù)據(jù)* * * 注:在 InkCanvas 有濕(wet)和干(dry)的感念* 所謂的濕就是指鼠標(biāo)按下后移動,在鼠標(biāo)抬起來之前繪制出的涂鴉* 所謂的干就是指鼠標(biāo)抬起后,真正顯示在 InkCanvas 上的涂鴉(鼠標(biāo)抬起后可以將 wet 做一些自定義處理,然后再 dry 到 InkCanvas 上)* 如何在 wet 和 dry 之間做自定義處理呢?需要通過 InkPresenter 的 ActivateCustomDrying() 方法獲取到 InkSynchronizer 對象來實(shí)現(xiàn),具體的示例在之后介紹 Win2D 的時(shí)候再寫*/using Windows.Foundation; using Windows.UI; using Windows.UI.Core; using Windows.UI.Input.Inking; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Media; using Windows.UI.Xaml.Shapes; using System.Linq; using System.Collections.Generic; using System;namespace Windows10.Controls.MediaControl {public sealed partial class InkCanvasDemo2 : Page{// 右鍵軌跡(用于選擇涂鴉)private Polyline _polyline;// 被選中的涂鴉所在的 Rect 區(qū)域private Rect _rect;public InkCanvasDemo2(){this.InitializeComponent();inkCanvas.InkPresenter.InputDeviceTypes = CoreInputDeviceTypes.Mouse | CoreInputDeviceTypes.Pen | CoreInputDeviceTypes.Touch;InkDrawingAttributes drawingAttributes = inkCanvas.InkPresenter.CopyDefaultDrawingAttributes();drawingAttributes.IgnorePressure = true;drawingAttributes.Color = Colors.Red;drawingAttributes.Size = new Size(4, 4);inkCanvas.InkPresenter.UpdateDefaultDrawingAttributes(drawingAttributes);// 此設(shè)置用于禁用鼠標(biāo)右鍵的涂鴉功能,從而在后面實(shí)現(xiàn)鼠標(biāo)右鍵的選擇涂鴉的功能inkCanvas.InkPresenter.InputProcessingConfiguration.RightDragAction = InkInputRightDragAction.LeaveUnprocessed;inkCanvas.InkPresenter.UnprocessedInput.PointerPressed += UnprocessedInput_PointerPressed;inkCanvas.InkPresenter.UnprocessedInput.PointerMoved += UnprocessedInput_PointerMoved;inkCanvas.InkPresenter.UnprocessedInput.PointerReleased += UnprocessedInput_PointerReleased;inkCanvas.InkPresenter.StrokeInput.StrokeStarted += StrokeInput_StrokeStarted;inkCanvas.InkPresenter.StrokesErased += InkPresenter_StrokesErased;}// 右鍵按下private void UnprocessedInput_PointerPressed(InkUnprocessedInput sender, PointerEventArgs args){// 右鍵軌跡_polyline = new Polyline(){Stroke = new SolidColorBrush(Colors.Blue),StrokeThickness = 1,StrokeDashArray = new DoubleCollection() { 5, 2 },};_polyline.Points.Add(args.CurrentPoint.RawPosition);// 繪制右鍵軌跡 selectionCanvas.Children.Add(_polyline);}// 右鍵按下后在 InkCanvas 中移動private void UnprocessedInput_PointerMoved(InkUnprocessedInput sender, PointerEventArgs args){// 更新右鍵軌跡 _polyline.Points.Add(args.CurrentPoint.RawPosition);}// 右鍵抬起private void UnprocessedInput_PointerReleased(InkUnprocessedInput sender, PointerEventArgs args){// 更新右鍵軌跡 _polyline.Points.Add(args.CurrentPoint.RawPosition);// 獲取右鍵圈起來的區(qū)域內(nèi)的涂鴉所在的 Rect 區(qū)域_rect = inkCanvas.InkPresenter.StrokeContainer.SelectWithPolyLine(_polyline.Points);DrawBoundingRect();}// 繪制 _rect 區(qū)域(即被選中的涂鴉所在的 Rect 區(qū)域)private void DrawBoundingRect(){selectionCanvas.Children.Clear();if ((_rect.Width == 0) || (_rect.Height == 0) || _rect.IsEmpty){return;}var rectangle = new Rectangle(){Stroke = new SolidColorBrush(Colors.Blue),StrokeThickness = 1,StrokeDashArray = new DoubleCollection() { 5, 2 },Width = _rect.Width,Height = _rect.Height};Canvas.SetLeft(rectangle, _rect.X);Canvas.SetTop(rectangle, _rect.Y);selectionCanvas.Children.Add(rectangle);}// 開始此次涂鴉后private void StrokeInput_StrokeStarted(InkStrokeInput sender, PointerEventArgs args){ClearSelection();}// 擦除某些涂鴉后private void InkPresenter_StrokesErased(InkPresenter sender, InkStrokesErasedEventArgs args){ClearSelection();}// 清除涂鴉的選中狀態(tài),以及選中框private void ClearSelection(){IReadOnlyList<InkStroke> strokes = inkCanvas.InkPresenter.StrokeContainer.GetStrokes();foreach (var stroke in strokes){stroke.Selected = false;}ClearDrawnBoundingRect();}// 清除涂鴉的選中框private void ClearDrawnBoundingRect(){if (selectionCanvas.Children.Any()){selectionCanvas.Children.Clear();_rect = Rect.Empty;}}// 清除全部涂鴉private void clear_Click(object sender, RoutedEventArgs e){ClearDrawnBoundingRect();inkCanvas.InkPresenter.StrokeContainer.Clear();}// 剪切選中涂鴉到剪切板private void cut_Click(object sender, RoutedEventArgs e){ClearDrawnBoundingRect();inkCanvas.InkPresenter.StrokeContainer.CopySelectedToClipboard();Rect rect = inkCanvas.InkPresenter.StrokeContainer.DeleteSelected();}// 復(fù)制選中涂鴉到剪切板private void copy_Click(object sender, RoutedEventArgs e){inkCanvas.InkPresenter.StrokeContainer.CopySelectedToClipboard();}// 從剪切板粘貼涂鴉private void paste_Click(object sender, RoutedEventArgs e){if (inkCanvas.InkPresenter.StrokeContainer.CanPasteFromClipboard()){Rect rect = inkCanvas.InkPresenter.StrokeContainer.PasteFromClipboard(new Point(0, 0));}}// 移動選中涂鴉private void move_Click(object sender, RoutedEventArgs e){Rect rect = inkCanvas.InkPresenter.StrokeContainer.MoveSelected(new Point(10, 10));_rect = rect;DrawBoundingRect();}// 克隆全部涂鴉private void cloneAll_Click(object sender, RoutedEventArgs e){Random random = new Random();IReadOnlyList<InkStroke> oldStrokes = inkCanvas.InkPresenter.StrokeContainer.GetStrokes();List<InkStroke> newStrokes = new List<InkStroke>();foreach (InkStroke oldStroke in oldStrokes){InkStroke newStroke = oldStroke.Clone();newStroke.Selected = true;newStrokes.Add(newStroke);}inkCanvas.InkPresenter.StrokeContainer.AddStrokes(newStrokes);inkCanvas.InkPresenter.StrokeContainer.MoveSelected(new Point(random.Next(5, 30), random.Next(5, 30)));ClearSelection();}// 選中全部涂鴉private void selectAll_Click(object sender, RoutedEventArgs e){Rect rect = inkCanvas.InkPresenter.StrokeContainer.BoundingRect;_rect = rect;IReadOnlyList<InkStroke> strokes = inkCanvas.InkPresenter.StrokeContainer.GetStrokes();foreach (var stroke in strokes){stroke.Selected = true;}DrawBoundingRect();}// 改變?nèi)客盔f的顏色private void changeColor_Click(object sender, RoutedEventArgs e){Random random = new Random();Color color = Color.FromArgb(255, (byte)random.Next(0, 256), (byte)random.Next(0, 256), (byte)random.Next(0, 256));IReadOnlyList<InkStroke> strokes = inkCanvas.InkPresenter.StrokeContainer.GetStrokes();foreach (var stroke in strokes){InkDrawingAttributes drawingAttributes = stroke.DrawingAttributes;drawingAttributes.Color = color;stroke.DrawingAttributes = drawingAttributes;}}} }
OK
[源碼下載]
轉(zhuǎn)載于:https://www.cnblogs.com/lonelyxmas/p/7568433.html
總結(jié)
以上是生活随笔為你收集整理的背水一战 Windows 10 (61) - 控件(媒体类): InkCanvas 涂鸦编辑的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: msyql存储长度
- 下一篇: 【作业】组合数据类型练习,英文词频统计实