C# WPF自制批注工具(方便標記重點和演示)

? ?在教學和演示中,我們通常需要對重點進行批注,下載安裝第三方工具批注顯得很麻煩。本篇使用WPF開發了一個批注工具,工具小巧,功能豐富,非常使用日常免費使用,或者進行再次開發。

自制批注工具具有以下功能特點:

  • 支持圖畫,擦除,撤銷,恢復,改變畫板顏色功能
  • 提供顏色選擇和線條大小設置功能
  • 方便演示教學

示例代碼如下:

        Stack<StrokeCollection> undoStack = new Stack<StrokeCollection>();//撤銷Stack<StrokeCollection> recoverStack = new Stack<StrokeCollection>();//恢復撤銷public MainWindow(){InitializeComponent();try{EraserCanvas.MouseDown += EraserCanvas_MouseDown;EraserCanvas.MouseMove += EraserCanvas_MouseMove;EraserCanvas.MouseUp += EraserCanvas_MouseUp;Global.Instance.CurrentCanvas.PreviewMouseDown += WriteBorad_PreviewMouseDown;InkCanvasRootPanel.Children.Clear();InkCanvasRootPanel.Children.Add(Global.Instance.CurrentCanvas);}catch (Exception){}}private void Window_Loaded(object sender, RoutedEventArgs e){//設置色板和清空橡皮位置Window window = Window.GetWindow(rdoPen);Point point = rdoPen.TransformToAncestor(window).Transform(new Point(0, 0));translateColor.X = translateColor.X - 100;translateEraser.X = translateEraser.X-30;if (rdoPenWidthMin.Content.ToString() == Global.Instance.ColorHelper.selectedPenWidth.Trim())rdoPenWidthMin.IsChecked = true;else if (rdoPenWidthMedium.Content.ToString() == Global.Instance.ColorHelper.selectedPenWidth.Trim())rdoPenWidthMedium.IsChecked = true;else if (rdoPenWidthMax.Content.ToString() == Global.Instance.ColorHelper.selectedPenWidth.Trim())rdoPenWidthMax.IsChecked = true;//初始化色板foreach (string color in Global.Instance.ColorHelper.colorList){RadioButton btntemp = new RadioButton();btntemp.SetResourceReference(StyleProperty, "ColorSelectStyle");btntemp.Width = 30;btntemp.Height = 30;btntemp.Margin = new Thickness(2, 2, 2, 0);btntemp.Background = new SolidColorBrush((System.Windows.Media.Color)ColorConverter.ConvertFromString(color));if (btntemp.Background.ToString() == Global.Instance.ColorHelper.selectedColor){btntemp.IsChecked = true;Global.Instance.CurrentCanvas.DefaultDrawingAttributes.Color =(System.Windows.Media.Color)ColorConverter.ConvertFromString((string)Global.Instance.ColorHelper.selectedColor);}                    uniformColor.Children.Add(btntemp);}}#region InkCanvas操作bool transformColorFlag = false;bool transformEraserClearFlag = false;private void RadioButton_Click(object sender, RoutedEventArgs e){//橡皮模式下選擇其他工具關閉橡皮擦功能EraserCanvas.Visibility = Visibility.Collapsed;_eraserisDown = false;//如果色板打開下選擇其他工具,隱藏色板工具if (!(bool)rdoPen.IsChecked){transformColorFlag = false;translateColor.Y = 300;}if (!(bool)rdoEraser.IsChecked){transformEraserClearFlag = false;translateEraser.Y = 100;}if ((sender as RadioButton).Content.ToString() == "畫筆"){//Topmost = false;this.Background = (Brush)new BrushConverter().ConvertFromString("#01000000");if (transformColorFlag){translateColor.Y = -10;}else{translateColor.Y = 300;}transformColorFlag = !transformColorFlag;Global.Instance.CurrentCanvas.EditingMode = InkCanvasEditingMode.Ink;}else if ((sender as RadioButton).Content.ToString() == "橡皮"){this.Background = (Brush)new BrushConverter().ConvertFromString("#01000000");if (transformEraserClearFlag){translateEraser.Y = -10;}else{translateEraser.Y = 100;}transformEraserClearFlag = !transformEraserClearFlag;Global.Instance.CurrentCanvas.EditingMode = InkCanvasEditingMode.None;EraserCanvas.Visibility = Visibility.Visible;TranslateTransform.X = -1000;TranslateTransform.Y = -1000;}else if ((sender as RadioButton).Content.ToString() == "選擇"){//Topmost = true;this.Background = System.Windows.Media.Brushes.Transparent;Global.Instance.CurrentCanvas.EditingMode = InkCanvasEditingMode.None;// Global.Instance.CurrentCanvas.EditingMode = InkCanvasEditingMode.Select;}else if ((sender as RadioButton).Content.ToString() == "撤銷"){if (undoStack.Count > 0){recoverStack.Push(Global.Instance.CurrentCanvas.Strokes.Clone());Global.Instance.CurrentCanvas.Strokes = undoStack.Pop();}}else if ((sender as RadioButton).Content.ToString() == "恢復"){if (recoverStack.Count > 0){undoStack.Push( Global.Instance.CurrentCanvas.Strokes.Clone());Global.Instance.CurrentCanvas.Strokes = recoverStack.Pop();}}}#endregion

實例鏈接:https://download.csdn.net/download/lvxingzhe3/89505204

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/39605.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/39605.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/39605.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AUTOSAR NvM模塊(五)

NvMRbCallbackSignatureAR45 改變回調函數的參數類型。 TRUE&#xff1a;根據AR44及之后版本&#xff0c;回調函數使用NvM_<Multi;Init>BlockRequestType參數類型。詳細的函數調用參數請參考回調參數。 FALSE&#xff1a;根據AR43及之前版本&#xff0c;回調函數使用S…

GPT-5 一年半后發布,對此你有何期待?

CHATGPT5&#xff1a;未來一年內的期待與挑戰 隨著人工智能技術的飛速發展&#xff0c;自然語言處理&#xff08;NLP&#xff09;領域的突破不斷涌現。在這一背景下&#xff0c;CHATGPT系列模型作為NLP領域的佼佼者&#xff0c;其每一次的更新都牽動著業界的目光。當得知CHATG…

Spring Boot中泛型參數的靈活運用:最佳實踐與性能優化

泛型是Java中一種強大的特性&#xff0c;它提供了編寫通用代碼的能力&#xff0c;使得代碼更加靈活和可復用。在Spring Boot應用程序中&#xff0c;泛型參數的靈活運用可以帶來諸多好處&#xff0c;包括增強代碼的可讀性、提高系統的健壯性以及優化系統的性能。本文將深入探討在…

Flask 數據創建時出錯

當我們在使用 Flask 創建數據時遇到錯誤&#xff0c;可能有多種原因&#xff0c;包括代碼錯誤、數據庫配置問題或依賴項錯誤。具體情況我會總結成一篇文章記錄下&#xff0c;主要是歸類總結一些常見的解決方法和調試步驟&#xff0c;幫助大家解決問題&#xff1a; 1、問題背景 …

2024.7.2 隨筆 控制內心的焦慮

文章目錄 前言2024.7.2 隨筆 控制內心的焦慮人生的新階段冒名頂替綜合征年齡焦慮、職業焦慮未來的計劃 前言 我已經記不清楚&#xff0c;好久沒有這樣寫長篇的博文&#xff0c;或者說是&#xff0c;感悟吧。起因是刷到了一個博主的視頻&#xff0c;真的治愈了我的內心&#xf…

OFDM技術概述8——FBMC

Filter bank multicarrier(FBMC&#xff0c;濾波器組多載波)&#xff0c;是一種類似于OFDM的調制方式&#xff0c;用濾波器抑制子載波的旁瓣大小&#xff0c;使用FFT/IFFT或多相濾波器實現&#xff0c;其應用于5G的主要優勢&#xff1a; 子載波信號帶限&#xff0c;帶外泄漏小…

Perl 簡介

Perl 簡介 Perl 是一種高級、通用、解釋型、動態編程語言。由 Larry Wall 于 1987 年首次發布,設計哲學是“易于修改”和“實用”。Perl 的名字源自“Practical Extraction and Reporting Language”,但也可以解釋為“Pathologically Eclectic Rubbish Lister”。Perl 被廣泛…

LiveNVR監控流媒體Onvif/RTSP用戶手冊-視頻廣場:狀態記錄、播放、回放入口、篩選在線離線、搜索

LiveNVR監控流媒體Onvif/RTSP用戶手冊-視頻廣場:狀態記錄、播放、回放入口、篩選在線離線、搜索 1、視頻廣場1.1、搜索篩選1.2、狀態記錄1.3、播放1.4、視頻信息1.5、回放入口 2、RTSP/HLS/FLV/RTMP拉流Onvif流媒體服務 1、視頻廣場 1.1、搜索篩選 可以下拉篩選 在線、離線 &a…

C++部分復習筆記上

C語法復習 1. C入門基礎 缺省參數 半缺省參數必須從右往左依次來給出&#xff0c;不能間隔著給缺省參數不能在函數聲明和定義中同時出現缺省值必須是常量或者全局變量C語言不支持&#xff08;編譯器不支持&#xff09; 函數重載 函數重載是函數的一種特殊情況&#xff0c;…

前端跨域問題--解析與實戰

引言 在現代網絡應用中&#xff0c;跨域問題是一個常見的挑戰。由于瀏覽器的同源策略&#xff0c;限制了從不同源&#xff08;域名、協議或端口&#xff09;進行資源共享&#xff0c;這就造成了跨域訪問的限制。跨域資源共享&#xff08;CORS&#xff09;是一種技術&#xff0…

如何無線連接ios,自動化穩定

如果你的iPhone的USB端口無法使用&#xff0c;但你需要進行自動化測試或其他操作&#xff0c;可以通過無線連接來實現。無線連接通常涉及到使用Wi-Fi網絡&#xff0c;這樣你就可以在不使用USB線的情況下與設備交互。以下是一些可以考慮的方法&#xff1a; 1.使用Xcode進行無線…

William Yang:從區塊鏈先鋒到藝術平臺創始人

在區塊鏈技術和加密貨幣市場飛速發展的今天&#xff0c;William Yang無疑是這一領域的佼佼者。他不僅在學術和媒體領域取得了顯著成就&#xff0c;更在創業之路上不斷探索&#xff0c;成為了業內知名的KOL&#xff08;關鍵意見領袖&#xff09;。今天&#xff0c;我們有幸采訪到…

AI姓氏頭像生成微信小程序系統源碼

&#x1f525;【科技新潮流】AI姓氏頭像生成系統&#xff0c;你的專屬個性新名片&#xff01;&#x1f389; &#x1f31f; 開篇驚艷&#xff1a;一鍵解鎖你的姓氏魅力 ? Hey小伙伴們&#xff0c;今天我要安利一個超酷炫的科技小玩意——AI姓氏頭像生成系統&#xff01;是不…

js字符串序列化為二進制數據

在JavaScript中&#xff0c;可以通過不同的方式將字符串序列化為二進制數據。以下是幾種常見的方法&#xff1a; TextEncoder 和 TextDecoder JavaScript 提供了 TextEncoder 和 TextDecoder 對象&#xff0c;可以用來處理字符串和二進制數據之間的轉換。 // 將字符串轉換為二進…

MySQL Server時區支持

本文介紹MySQL維護的時區設置——如何加載命名時間支持所需的系統表&#xff0c;如何及時了解時區變化&#xff0c;以及如何啟用閏秒支持。 從MySQL 8.0.19開始&#xff0c;插入的日期時間值也支持時區偏移。 1 時區變量 MySQL Server維護了幾個時區設置&#xff1a; 服務器…

爬蟲筆記20——票星球搶票腳本的實現

以下內容僅供交流學習使用&#xff01;&#xff01;&#xff01; 思路分析 前面的爬蟲筆記一步一步走過來我們的技術水平也有了較大的提升了&#xff0c;現在我們來進行一下票星球搶票實戰項目&#xff0c;實現票星球的自動搶票。 我們打開票星球的移動端頁面&#xff0c;分…

視頻字幕提取在線工具有哪些?總結5個字幕提取工具

平時在沉浸式追劇的時候&#xff0c;我們常常都會被影視劇中的各種金句爆梗而逗得開懷大笑~而真正要用到時候卻總是一片頭腦空白。其實要記住它們最好的辦法便是將其提取留檔下來&#xff0c;每次有需要的時候打開就能一下子回顧到~ 今天就來帶大家盤一盤視頻字幕提取的軟件好…

高考假期預習指南

人不走空 &#x1f308;個人主頁&#xff1a;人不走空 &#x1f496;系列專欄&#xff1a;算法專題 ?詩詞歌賦&#xff1a;斯是陋室&#xff0c;惟吾德馨 目錄 &#x1f308;個人主頁&#xff1a;人不走空 &#x1f496;系列專欄&#xff1a;算法專題 ?詩詞歌…

目標檢測YOLO實戰應用案例100講-基于深度學習的無人機影像小目標識別

目錄 前言 研究現狀 深度學習研究現狀 目標檢測研究現狀 目標檢測存在的問題 2 基于深度學習的目標檢測算法理論基礎 2.1 卷積神經網絡 2.1.1 卷積層 2.1.2 池化層 2.1.3 激活函數 2.1.4 全連接層 2.2 優化器 2.3 基于深度學習的目標檢測算法 2.3.1 …

樹上差分的公式推導

今天寫了一道題目&#xff0c;需要采用線段樹合并樹上差分來解決 題目鏈接&#xff1a;P1600 [NOIP2016 提高組] 天天愛跑步 - 洛谷 | 計算機科學教育新生態 (luogu.com.cn) 其實當時已經想到要用這兩種方法&#xff0c;但苦于一直找不到轉移方程&#xff0c;最后看了答案才領…