背水一戰 Windows 10 (60) - 控制項(媒體類): Pointer 塗鴉板, InkCanvas 塗鴉板

来源:http://www.cnblogs.com/webabcd/archive/2017/07/24/7226945.html
-Advertisement-
Play Games

背水一戰 Windows 10 之 控制項(媒體類): 通過處理 Pointer 相關事件實現一個簡單的塗鴉板, InkCanvas 基礎知識 ...


[源碼下載]


背水一戰 Windows 10 (60) - 控制項(媒體類): Pointer 塗鴉板, InkCanvas 塗鴉板



作者:webabcd


介紹
背水一戰 Windows 10 之 控制項(媒體類)

  • 通過處理 Pointer 相關事件實現一個簡單的塗鴉板
  • InkCanvas 基礎知識



示例
1、演示如何通過 Pointer 相關事件的處理,來實現一個簡單的塗鴉板
Controls/MediaControl/InkSimple.xaml

<Page
    x:Class="Windows10.Controls.MediaControl.InkSimple"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Windows10.Controls.MediaControl"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">
    
    <Grid Background="Transparent">
        <StackPanel Margin="10 0 10 10">

            <Button Name="btnClear" Content="清除" Click="btnClear_Click" Margin="5" />

            <Canvas Name="canvas" Background="Blue" Width="800" Height="480" HorizontalAlignment="Left" Margin="5" />

        </StackPanel>
    </Grid>
</Page>

Controls/MediaControl/InkSimple.xaml.cs

/*
 * 本例用於演示如何通過 Pointer 相關事件的處理,來實現一個簡單的塗鴉板
 */

using System;
using System.Collections.Generic;
using Windows.Foundation;
using Windows.UI;
using Windows.UI.Input;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Shapes;

namespace Windows10.Controls.MediaControl
{
    public sealed partial class InkSimple : Page
    {
        // 用於保存觸摸點(PointerId - Point)
        private Dictionary<uint, Point?> _dicPoint;

        public InkSimple()
        {
            this.InitializeComponent();

            canvas.PointerPressed += canvas_PointerPressed;
            canvas.PointerMoved += canvas_PointerMoved;
            canvas.PointerReleased += canvas_PointerReleased;
            canvas.PointerExited += canvas_PointerExited;

            _dicPoint = new Dictionary<uint, Point?>();
        }

        void canvas_PointerPressed(object sender, PointerRoutedEventArgs e)
        {
            // 指針按下後,保存此觸摸點
            PointerPoint pointerPoint = e.GetCurrentPoint(canvas);
            _dicPoint[pointerPoint.PointerId] = pointerPoint.Position;
        }

        void canvas_PointerMoved(object sender, PointerRoutedEventArgs e)
        {
            PointerPoint pointerPoint = e.GetCurrentPoint(canvas);

            if (_dicPoint.ContainsKey(pointerPoint.PointerId) && _dicPoint[pointerPoint.PointerId].HasValue)
            {
                Point currentPoint = pointerPoint.Position;
                Point previousPoint = _dicPoint[pointerPoint.PointerId].Value;

                // 如果指針移動過程中,兩個點間的距離超過 4 則在兩點間繪製一條直線,以完成塗鴉
                if (ComputeDistance(currentPoint, previousPoint) > 4)
                {
                    Line line = new Line()
                    {
                        X1 = previousPoint.X,
                        Y1 = previousPoint.Y,
                        X2 = currentPoint.X,
                        Y2 = currentPoint.Y,
                        StrokeThickness = 5,
                        Stroke = new SolidColorBrush(Colors.Orange),
                        StrokeEndLineCap = PenLineCap.Round
                    };

                    _dicPoint[pointerPoint.PointerId] = currentPoint;
                    canvas.Children.Add(line);
                }
            }
        }

        void canvas_PointerReleased(object sender, PointerRoutedEventArgs e)
        {
            // 指針釋放後,從字典中刪除此 PointerId 的數據
            PointerPoint pointerPoint = e.GetCurrentPoint(canvas);
            if (_dicPoint.ContainsKey(pointerPoint.PointerId))
                _dicPoint.Remove(pointerPoint.PointerId);
        }

        void canvas_PointerExited(object sender, PointerRoutedEventArgs e)
        {
            // 指針離開相當於指針釋放
            canvas_PointerReleased(sender, e);
        }

        // 清除塗鴉
        private void btnClear_Click(object sender, RoutedEventArgs e)
        {
            canvas.Children.Clear();
            _dicPoint.Clear();
        }

        // 計算兩個點(Point)之間的距離
        private double ComputeDistance(Point point1, Point point2)
        {
            return Math.Sqrt(Math.Pow(point1.X - point2.X, 2) + Math.Pow(point1.Y - point2.Y, 2));
        }
    }
}


2、演示 InkCanvas 基礎知識
Controls/MediaControl/InkCanvasDemo1.xaml

<Page
    x:Class="Windows10.Controls.MediaControl.InkCanvasDemo1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Windows10.Controls.MediaControl"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="Transparent">
        <StackPanel Margin="10 0 10 10">

            <Border Background="White" Width="480" Height="320" Margin="5" HorizontalAlignment="Left">
                <!--
                    InkCanvas - 塗鴉板控制項
                -->
                <InkCanvas Name="inkCanvas" />
            </Border>

            <ComboBox Name="drawingColor" Header="Color" SelectedIndex="0" SelectionChanged="UpdateDefaultDrawingAttributes_Handler" Margin="5">
                <x:String>Red</x:String>
                <x:String>Green</x:String>
                <x:String>Blue</x:String>
            </ComboBox>
            <Slider Name="drawingSize" Foreground="Orange" Background="Red" Style="{StaticResource MySliderStyle}" Header="Size" Minimum="1" Maximum="20" Value="5" ValueChanged="UpdateDefaultDrawingAttributes_Handler" Margin="5" />
            <CheckBox Name="drawingDrawAsHighlighter" Content="DrawAsHighlighter" IsChecked="False" Checked="UpdateDefaultDrawingAttributes_Handler" Unchecked="UpdateDefaultDrawingAttributes_Handler" Margin="5" />
            <CheckBox Name="drawingFitToCurve" Content="FitToCurve" IsChecked="True" Checked="UpdateDefaultDrawingAttributes_Handler" Unchecked="UpdateDefaultDrawingAttributes_Handler" Margin="5" />
            <ToggleSwitch Name="drawingPenTip" Style="{StaticResource MyToggleSwitchStyle}" OnContent="PenTipShape.Circle" OffContent="PenTipShape.Rectangle" IsOn="True" Toggled="UpdateDefaultDrawingAttributes_Handler" Margin="5" />
            <CheckBox Name="drawingPenTipTransform" Content="通過 PenTipTransform 轉換 PenTip 來實現筆尖形狀的自定義" IsChecked="False" Checked="UpdateDefaultDrawingAttributes_Handler" Unchecked="UpdateDefaultDrawingAttributes_Handler" Margin="5" />
            <CheckBox Name="chkErasing" Content="將輸入指定為擦除模式" IsChecked="False" Checked="UpdateDefaultDrawingAttributes_Handler" Unchecked="UpdateDefaultDrawingAttributes_Handler" Margin="5" />
            <CheckBox Name="chkIsInputEnabled" Content="IsInputEnabled" IsChecked="True" Checked="UpdateDefaultDrawingAttributes_Handler" Unchecked="UpdateDefaultDrawingAttributes_Handler" Margin="5" />
            <Button Name="buttonClear" Content="全部清除"  Click="buttonClear_Click" />

        </StackPanel>
    </Grid>
</Page>

Controls/MediaControl/InkCanvasDemo1.xaml.cs

/*
 * InkCanvas - 塗鴉板控制項(繼承自 FrameworkElement, 請參見 /Controls/BaseControl/FrameworkElementDemo/)
 *     InkPresenter - 獲取 InkPresenter 對象
 *        
 * InkPresenter - 塗鴉板
 *     IsInputEnabled - 是否啟用塗鴉板
 *     InputDeviceTypes - 輸入設備的類型(None, Touch, Pen, Mouse)
 *     InputProcessingConfiguration.Mode - 輸入模式(None, Inking, Erasing)
 *     CopyDefaultDrawingAttributes() - 獲取 InkDrawingAttributes 對象
 *     UpdateDefaultDrawingAttributes(InkDrawingAttributes value) - 設置 InkDrawingAttributes 對象
 *     
 * InkDrawingAttributes - 塗鴉筆尖屬性
 *     IgnorePressure - 是否忽略觸摸壓力
 *     Color - 筆尖的顏色
 *     Size - 筆尖的尺寸(寬和高)
 *     DrawAsHighlighter - 覆蓋之前的塗鴉時(false - 直接覆蓋;true - 高亮顯示覆蓋區域)
 *     FitToCurve - 塗鴉時(true - 使用貝塞爾曲線生成塗鴉;false - 使用直線生成塗鴉)
 *     PenTip - 筆尖的形狀(Circle, Rectangle)
 *     PenTipTransform - 用於轉換 PenTip 的 Matrix3x2 仿射轉換矩陣(Matrix3x2 提供了一些簡便的方法:CreateRotation, CreateScale, CreateSkew, CreateTranslation 等)。通過它可以自定義筆尖的形狀
 */

using System.Numerics;
using Windows.Foundation;
using Windows.UI;
using Windows.UI.Core;
using Windows.UI.Input.Inking;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

namespace Windows10.Controls.MediaControl
{
    public sealed partial class InkCanvasDemo1 : Page
    {
        private InkPresenter _inkPresenter;

        public InkCanvasDemo1()
        {
            this.InitializeComponent();

            _inkPresenter = inkCanvas.InkPresenter;
            _inkPresenter.InputDeviceTypes = CoreInputDeviceTypes.Mouse | CoreInputDeviceTypes.Pen | CoreInputDeviceTypes.Touch;

            UpdateDefaultDrawingAttributes();
        }
        
        private void UpdateDefaultDrawingAttributes_Handler(object sender, RoutedEventArgs e)
        {
            UpdateDefaultDrawingAttributes();
        }

        private void buttonClear_Click(object sender, RoutedEventArgs e)
        {
            _inkPresenter.StrokeContainer.Clear();
        }

        private void UpdateDefaultDrawingAttributes()
        {
            if (_inkPresenter != null)
            {
                InkDrawingAttributes drawingAttributes = _inkPresenter.CopyDefaultDrawingAttributes();
                drawingAttributes.IgnorePressure = true;

                switch (drawingColor.SelectedValue.ToString())
                {
                    case "Red":
                        drawingAttributes.Color = Colors.Red;
                        break;
                    case "Green":
                        drawingAttributes.Color = Colors.Green;
                        break;
                    case "Blue":
                        drawingAttributes.Color = Colors.Blue;
                        break;
                }

                drawingAttributes.Size = new Size(drawingSize.Value, drawingSize.Value);
                drawingAttributes.DrawAsHighlighter = drawingDrawAsHighlighter.IsChecked.Value;
                drawingAttributes.FitToCurve = drawingFitToCurve.IsChecked.Value;
                drawingAttributes.PenTip = drawingPenTip.IsOn ? PenTipShape.Circle : PenTipShape.Rectangle;



                if (drawingPenTipTransform.IsChecked == true)
                    drawingAttributes.PenTipTransform = Matrix3x2.CreateSkew(4, 4);
                else
                    drawingAttributes.PenTipTransform = Matrix3x2.Identity;

                _inkPresenter.UpdateDefaultDrawingAttributes(drawingAttributes);



                if (chkErasing.IsChecked == true)
                    _inkPresenter.InputProcessingConfiguration.Mode = InkInputProcessingMode.Erasing;
                else
                    _inkPresenter.InputProcessingConfiguration.Mode = InkInputProcessingMode.Inking;



                _inkPresenter.IsInputEnabled = chkIsInputEnabled.IsChecked.Value;
            }
        }
    }
}



OK
[源碼下載]


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在應用中我們經常會登陸其他的主機,每次都需要輸入用戶名和密碼。另外在hadoop的使用中也會使用ssh命令去連接其它的主機。我們可以設置SSH免密碼登陸來實現其他主機登錄該主機是不用輸入密碼。 現在我們有兩台測試的linux的虛擬機,我們稱之為主機1和主機2。ip分別為192.168.1.101和1 ...
  • 為wget使用代理,可以直接修改/etc/wgetrc,也可以在主文件夾下新建.wgetrc,並編輯相應內容,本文采用後者。 直接往~/.wgetrc(自行創建此文件)添加如下內容: https_proxy = http://127.0.0.1:8087/http_proxy = http://12 ...
  • 在使用電腦時,其最大支持的記憶體是由 操作系統 和 硬體 兩方面決定的。 先說一下硬體方面的因素,在電腦中 CPU的地址匯流排數目 決定了CPU 的 定址 範圍,這種由地址匯流排對應的地址稱作為物理地址。假如CPU有32根地址匯流排(一般情況下32位的CPU的地址匯流排是32位,也有部分32位的CPU地址 ...
  • 本文為命令rsync的man文檔翻譯,幾乎所有的選項都翻譯了,另外關於篩選規則部分只翻譯了一部分。由於原文很多地方都比較啰嗦,所以譯文中有些內容可能容易讓國人疑惑,所以我個人在某些地方加上了註釋。若有錯誤之處,盼請指出。 回到系列文章大綱:http://www.cnblogs.com/f-ck-ne ...
  • 本篇為rsync官方推薦文章How Rsync Works的翻譯,主要內容是Rsync術語說明和簡單版的rsync工作原理。本篇沒有通篇都進行翻譯,前言直接跳過了,但為了文章的完整性,前言部分的原文還是保留了。 How Rsync WorksA Practical Overview Foreword ...
  • 1. 首先進入單用戶模式: 1). ubuntu : 上述情況可以在grub界面選擇第二項修複,但沒有grub可以參考: 1、重啟ubuntu,隨即長按shirft進入grub菜單; 2、選擇recovery mode,按"e"鍵進入編輯頁面;如下: 非恢復模式為: 3、將ro recovery n ...
  • 1.先創建一個文件夾用以存放鏡像 2.運行vmware,點擊創建新的虛擬機 3.選擇典型安裝 4. 選擇稍後安裝操作系統 5.選擇客戶機操作系統為Linux,版本為CentOS 64位 6. 選擇一開始創建的用以存放鏡像的文件,並給虛擬機命名 7.選擇磁碟大小,選擇預設20G即可 8.點擊完成 9. ...
  • 做為程式員的我們,經常會要用到文件的上傳和下載功能。到了需要用的時候,各種查資料。有木有..有木有...。為了方便下次使用,這裡來做個總結和備忘。 利用表單實現文件上傳 最原始、最簡單、最粗暴的文件上傳。 前端代碼: 【註意】 1、需要post提交 2、enctype="multipart/form ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...