C# WPF自制白板工具
隨著電子屏幕技術(shù)的發(fā)展,普通的黑板已不再適用現(xiàn)在的教學(xué)和演示環(huán)境,電子白板應(yīng)運(yùn)而生。本篇使用WPF開(kāi)發(fā)了一個(gè)電子白板工具,功能豐富,非常使用日常免費(fèi)使用,或者進(jìn)行再次開(kāi)發(fā)。

示例代碼如下:
Stack<StrokeCollection> undoStack = new Stack<StrokeCollection>();//撤銷(xiāo)
Stack<StrokeCollection> recoverStack = new Stack<StrokeCollection>();//恢復(fù)撤銷(xiāo)
public MainWindow()
{
InitializeComponent();
this.DataContext = Global.Instance.WhiteBoardPageModel;
try
{
EraserCanvas.MouseDown += EraserCanvas_MouseDown;
EraserCanvas.MouseMove += EraserCanvas_MouseMove;
EraserCanvas.MouseUp += EraserCanvas_MouseUp;
Global.Instance.InkCanvasList[ Global.Instance.WhiteBoardPageModel.PageIndex-1].PreviewMouseDown += WriteBorad_PreviewMouseDown;
InkCanvasRootPanel.Children.Clear();
InkCanvasRootPanel.Children.Add(Global.Instance.InkCanvasList[Global.Instance.WhiteBoardPageModel.PageIndex - 1]);
}
catch (Exception)
{
}
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
//top = this.Top;
//left = this.Left;
//width = this.Width;
//heigh = this.Height;
//啟動(dòng)最大化白板
this.Top = this.Left = 0;
this.Width = SystemParameters.WorkArea.Width;
this.Height = SystemParameters.WorkArea.Height;
//設(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.InkCanvasList[ Global.Instance.WhiteBoardPageModel.PageIndex-1].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;
//如果色板打開(kāi)下選擇其他工具,隱藏色板工具
if (!(bool)rdoPen.IsChecked)
{
transformColorFlag = false;
translateColor.Y = 300;
}
if (!(bool)rdoEraser.IsChecked)
{
transformEraserClearFlag = false;
translateEraser.Y = 100;
}
if ((sender as RadioButton).Content.ToString() == "畫(huà)筆")
{
if (transformColorFlag)
{
translateColor.Y = -10;
}
else
{
translateColor.Y = 300;
}
transformColorFlag = !transformColorFlag;
Global.Instance.InkCanvasList[Global.Instance.WhiteBoardPageModel.PageIndex - 1].EditingMode = InkCanvasEditingMode.Ink;
}
else if ((sender as RadioButton).Content.ToString() == "橡皮")
{
if (transformEraserClearFlag)
{
translateEraser.Y = -10;
}
else
{
translateEraser.Y = 100;
}
transformEraserClearFlag = !transformEraserClearFlag;
Global.Instance.InkCanvasList[Global.Instance.WhiteBoardPageModel.PageIndex - 1].EditingMode = InkCanvasEditingMode.None;
EraserCanvas.Visibility = Visibility.Visible;
TranslateTransform.X = -1000;
TranslateTransform.Y = -1000;
//Global.Instance.InkCanvasList[ Global.Instance.WhiteBoardPageModel.PageIndex-1].EditingMode = InkCanvasEditingMode.EraseByPoint;
//Global.Instance.InkCanvasList[ Global.Instance.WhiteBoardPageModel.PageIndex-1].EditingMode = InkCanvasEditingMode.EraseByStroke;
}
else if ((sender as RadioButton).Content.ToString() == "選擇")
{
//PenFullScreen();
Global.Instance.InkCanvasList[Global.Instance.WhiteBoardPageModel.PageIndex - 1].EditingMode = InkCanvasEditingMode.None;
//Global.Instance.InkCanvasList[ Global.Instance.WhiteBoardPageModel.PageIndex-1].EditingMode = InkCanvasEditingMode.Select;
}
else if ((sender as RadioButton).Content.ToString() == "撤銷(xiāo)")
{
if (undoStack.Count > 0)
{
recoverStack.Push(Global.Instance.InkCanvasList[Global.Instance.WhiteBoardPageModel.PageIndex - 1].Strokes.Clone());
Global.Instance.InkCanvasList[Global.Instance.WhiteBoardPageModel.PageIndex - 1].Strokes = undoStack.Pop();
}
}
else if ((sender as RadioButton).Content.ToString() == "恢復(fù)")
{
if (recoverStack.Count > 0)
{
undoStack.Push(Global.Instance.InkCanvasList[Global.Instance.WhiteBoardPageModel.PageIndex - 1].Strokes.Clone());
Global.Instance.InkCanvasList[Global.Instance.WhiteBoardPageModel.PageIndex - 1].Strokes = recoverStack.Pop();
}
}
}
#endregion到此這篇關(guān)于C# WPF自制白板工具的文章就介紹到這了,更多相關(guān)WPF白板內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
WinForm實(shí)現(xiàn)讀取Resource中文件的方法
這篇文章主要介紹了WinForm實(shí)現(xiàn)讀取Resource中文件的方法,很實(shí)用的一個(gè)功能,需要的朋友可以參考下2014-08-08
C#實(shí)現(xiàn)Socket服務(wù)器及多客戶(hù)端連接的方式
這篇文章介紹了C#實(shí)現(xiàn)Socket服務(wù)器及多客戶(hù)端連接的方式,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01
C#創(chuàng)建安全的字典(Dictionary)存儲(chǔ)結(jié)構(gòu)
本文主要對(duì)存儲(chǔ)結(jié)構(gòu)字典(Dictionary)的一些常用方法進(jìn)行簡(jiǎn)單的說(shuō)明,并闡述了如何創(chuàng)建安全的字典(Dictionary)存儲(chǔ)結(jié)構(gòu)。希望對(duì)大家有所幫助2016-12-12
C#之Expression表達(dá)式樹(shù)實(shí)例
這篇文章主要介紹了C#之Expression表達(dá)式樹(shù),包括了表達(dá)式樹(shù)的原理與用法技巧,需要的朋友可以參考下2014-10-10
C#中Response.Write常見(jiàn)問(wèn)題匯總
這篇文章主要介紹了C#中Response.Write常見(jiàn)問(wèn)題匯總,總結(jié)了C#中Response.Write的常用技巧,非常實(shí)用,需要的朋友可以參考下2014-09-09
C#通過(guò)System.CommandLine快速生成支持命令行的應(yīng)用程序
這篇文章介紹了C#通過(guò)System.CommandLine快速生成支持命令行應(yīng)用程序的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
Visual C#類(lèi)的定義及實(shí)現(xiàn)方法實(shí)例解析
這篇文章主要介紹了Visual C#類(lèi)的定義及實(shí)現(xiàn)方法實(shí)例解析,對(duì)于新手來(lái)說(shuō)有不錯(cuò)的借鑒學(xué)習(xí)價(jià)值,需要的朋友可以參考下2014-07-07

