C# WPF自制簡單的批注工具
在教學(xué)和演示中,我們通常需要對重點進(jìn)行批注,下載安裝第三方工具批注顯得很麻煩。本篇使用WPF開發(fā)了一個批注工具,工具小巧,功能豐富,非常使用日常免費使用,或者進(jìn)行再次開發(fā)。

自制批注工具具有以下功能特點:
支持圖畫,擦除,撤銷,恢復(fù),改變畫板顏色功能
提供顏色選擇和線條大小設(shè)置功能
方便演示教學(xué)
示例代碼如下:
Stack<StrokeCollection> undoStack = new Stack<StrokeCollection>();//撤銷
Stack<StrokeCollection> recoverStack = new Stack<StrokeCollection>();//恢復(fù)撤銷
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)
{
//設(shè)置色板和清空橡皮位置
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)
{
//橡皮模式下選擇其他工具關(guān)閉橡皮擦功能
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() == "恢復(fù)")
{
if (recoverStack.Count > 0)
{
undoStack.Push( Global.Instance.CurrentCanvas.Strokes.Clone());
Global.Instance.CurrentCanvas.Strokes = recoverStack.Pop();
}
}
}
#endregion到此這篇關(guān)于C# WPF自制簡單的批注工具的文章就介紹到這了,更多相關(guān)WPF批注工具內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
12306奇葩驗證碼引發(fā)思考之C#實現(xiàn)驗證碼程序
春運最高峰來了!明天通過網(wǎng)絡(luò)將能買到小年夜的車票,本周四就將開售除夕日車票,但不少人被首次在春運期間使用的圖片驗證碼搞得很火大,小編也正在對驗證碼進(jìn)行研究,編寫了由C#實現(xiàn)驗證碼程序,分享給大家2015-12-12
C# TextBox控件實現(xiàn)只能輸入數(shù)字的方法
這篇文章主要介紹了C# TextBox控件實現(xiàn)只能輸入數(shù)字的方法,本文使用TextBox的keypress事件實現(xiàn)這個需求,需要的朋友可以參考下2015-06-06
Unity?UGUI的CanvasScaler畫布縮放器組件介紹使用
這篇文章主要為大家介紹了Unity?UGUI的CanvasScaler畫布縮放器組件介紹使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
C#中csv文件與DataTable互相導(dǎo)入處理實例解析
這篇文章主要介紹了C#中csv文件與DataTable互相導(dǎo)入處理實例解析,非常實用的功能,需要的朋友可以參考下2014-08-08
將文件夾下所有文件輸出到日志文件中 c#遞歸算法學(xué)習(xí)示例
這篇文章主要介紹了將文件夾下所有文件輸出到日志文件中,通過這個示例我們學(xué)習(xí)一下遞歸算法的使用方法2014-01-01

