C# WPF自制白板工具

 更新时间:2024年11月11日 15:33:30   作者:无熵~  
着电子屏幕技术的发展,普通的黑板已不再适用现在的教学和演示环境,电子白板应运而生,本文将通过C# WPF自制一个白板工具,感兴趣的可以了解下

随着电子屏幕技术的发展,普通的黑板已不再适用现在的教学和演示环境,电子白板应运而生。本篇使用WPF开发了一个电子白板工具,功能丰富,非常使用日常免费使用,或者进行再次开发。

示例代码如下:

        Stack<StrokeCollection> undoStack = new Stack<StrokeCollection>();//撤销
        Stack<StrokeCollection> recoverStack = new Stack<StrokeCollection>();//恢复撤销
 
        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;
 
            //启动最大化白板
            this.Top = this.Left = 0;
            this.Width = SystemParameters.WorkArea.Width;
            this.Height = SystemParameters.WorkArea.Height;
 
            //设置色板和清空橡皮位置
            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)
        {
            //橡皮模式下选择其他工具关闭橡皮擦功能
            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() == "画笔")
            {
                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() == "撤销")
            {
                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() == "恢复")
            {
                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

到此这篇关于C# WPF自制白板工具的文章就介绍到这了,更多相关WPF白板内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于C# 4.0新特性“缺省参数”的实现详解

    关于C# 4.0新特性“缺省参数”的实现详解

    这篇文章主要给大家介绍了关于C# 4.0新特性“缺省参数”的实现,文中通过示例代码介绍的非常详细,对大家学习或者使用C# 4.0具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-06-06
  • 实现ASP.NET无刷新下载并提示下载完成的开发思路

    实现ASP.NET无刷新下载并提示下载完成的开发思路

    这篇文章主要介绍了实现ASP.NET无刷新下载并提示下载完成的开发思路的相关资料,需要的朋友可以参考下
    2015-10-10
  • 解析C#面向对象编程中方法(method)的使用

    解析C#面向对象编程中方法(method)的使用

    这篇文章主要介绍了解析C#面向对象编程中方法(method)的使用,方法是面向对象编程语言中的基本特性,需要的朋友可以参考下
    2016-01-01
  • 详解C#多线程编程之进程与线程

    详解C#多线程编程之进程与线程

    这篇文章主要介绍了详解C#多线程编程之进程与线程的的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • 详解C# Socket编程笔记

    详解C# Socket编程笔记

    这篇文章主要介绍了详解C# Socket编程笔记,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧。
    2016-12-12
  • c# 实现语音合成

    c# 实现语音合成

    这篇文章主要介绍了c# 实现语音合成的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2020-12-12
  • C#中如何执行存储过程方法

    C#中如何执行存储过程方法

    C#中如何执行存储过程方法,需要的朋友可以参考一下
    2013-04-04
  • C#实现简单合并word文档的方法

    C#实现简单合并word文档的方法

    这篇文章主要介绍了C#实现简单合并word文档的方法,涉及C#针对word文档的读取、插入、保存等技巧,非常具有实用价值,需要的朋友可以参考下
    2015-09-09
  • C#学习笔记整理-迭代器模式介绍

    C#学习笔记整理-迭代器模式介绍

    下面小编就为大家分享一篇C#学习笔记整理-迭代器模式介绍,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • C#中的timer与线程使用

    C#中的timer与线程使用

    这篇文章主要介绍了C#中的timer与线程使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08

最新评论