在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例桌面应用界面/GUI → wpf绘图程序 源码下载(绘图工具)

wpf绘图程序 源码下载(绘图工具)

桌面应用界面/GUI

下载此实例
  • 开发语言:C#
  • 实例大小:0.36M
  • 下载次数:136
  • 浏览次数:2938
  • 发布时间:2016-06-21
  • 实例类别:桌面应用界面/GUI
  • 发 布 人:15002830693
  • 文件格式:.rar
  • 所需积分:2
 相关标签: 绘图 wpf

实例介绍

【实例介绍】

绘图程序

【实例截图】

【核心代码】

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Xml;

namespace MetroStopStation
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        AdornerLayer drawCanvasAdornerLayer;
        ResizeMoveAdorner resizeMoveAdorner = null;

        Point? mouseLeftButtonDownPoint = null;

        Label tmepLine = null;
        UIElement selectedUIElement = null;
        ToggleButton tempToggleButton = null;
        public MainWindow()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 选择工具箱的工具时,去掉选择工具的使用
        /// 选择工具带有修改元素装饰器,一起清除
        /// </summary>
        private void ClearSelectTool()
        {
            elementSelectTool.IsChecked = false;
            ClearResizeMoveAdorner();
            resizeMoveAdorner = null;
        }


        private void DrawCanvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            mouseLeftButtonDownPoint = e.GetPosition(drawCanvas);

            if (null != elementSelectTool.IsChecked && elementSelectTool.IsChecked == true)
            {
                Point moseDownPoint = (Point)mouseLeftButtonDownPoint;
                ModifyElement(moseDownPoint);
            }

        }



        private void DrawCanvas_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.LeftButton == MouseButtonState.Pressed)
            {
                Point nowMovingPoint = e.GetPosition(drawCanvas);
                if (toolBox.SelectedItem != null && mouseLeftButtonDownPoint != null)
                {
                    ListBoxItem selectedTool = toolBox.SelectedItem as ListBoxItem;
                    if (selectedTool.Name == "straightConnectLine")
                    {
                        string styleName = GetToolStyleName(selectedTool.Name, nowMovingPoint);
                        DrawTrackLabel(nowMovingPoint, styleName);
                    }
                    else if (selectedTool.Name == "LConnectLine")
                    {
                        string styleName = GetToolStyleName(selectedTool.Name, nowMovingPoint);
                        DrawTrackLabel(nowMovingPoint, styleName);                       
                    }
                    else if (selectedTool.Name == "switchToolItem")
                    {
                        DrawToggleButton(nowMovingPoint, "SwitchToggleButtonStyle");
                    }
                    else if (selectedTool.Name == "groundSwitchToolItem")
                    {
                        DrawToggleButton(nowMovingPoint, "GroundSwitchToggleButtonStyle");
                    }
                    else if (selectedTool.Name == "platDoorToolItem")
                    {
                        DrawToggleButton(nowMovingPoint, "PlatDoorToggleButtonStyle");
                    }
                    else if (selectedTool.Name == "electricConfirmToolItem")
                    {
                        DrawToggleButton(nowMovingPoint, "ElectricConfirmToggleButtonStyle");
                    }
                    else if (selectedTool.Name == "trackLineToolItem")
                    {
                        DrawTrackLabel(nowMovingPoint, "TrackLineLabelStyle");
                    }
                    else if (selectedTool.Name == "electricBreakToolItem")
                    {
                        DrawTrackLabel(nowMovingPoint, "LineBreakLabelStyle");
                    }
                    else if (selectedTool.Name == "trackNameToolItem")
                    {
                        DrawTrackLabel(nowMovingPoint, "TrackIDLabelStyle");
                    }
                }
            }

        }



        private void DrawCanvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            Point mouseUpPoint = e.GetPosition(drawCanvas);
            if (toolBox.SelectedItem != null)
            {
                ListBoxItem selectedTool = toolBox.SelectedItem as ListBoxItem;
                string styleName = GetToolStyleName(selectedTool.Name, mouseUpPoint);
                if (tempToggleButton != null && (selectedTool.Name == "switchToolItem" || selectedTool.Name == "groundSwitchToolItem" ||
                     selectedTool.Name == "platDoorToolItem" || selectedTool.Name == "electricConfirmToolItem"))
                {
                    SaveToggleButton(styleName);
                }
                else if (tmepLine != null && (selectedTool.Name == "LConnectLine" || selectedTool.Name == "straightConnectLine" || selectedTool.Name == "trackLineToolItem" || selectedTool.Name == "electricBreakToolItem" || selectedTool.Name == "trackNameToolItem"))
                {                   
                    SaveTrackLabel(styleName);
                }
            }

            mouseLeftButtonDownPoint = null;
        }



        private void DrawTrackLabel(Point nowMovingPoint, string styleName)
        {
            if (null != tmepLine)
            {
                drawCanvas.Children.Remove(tmepLine);
            }

            Point positionPoint = (Point)mouseLeftButtonDownPoint;

            double xOffset = nowMovingPoint.X - positionPoint.X;
            double yOffset = nowMovingPoint.Y - positionPoint.Y;

            StringBuilder xamlUIElementBuilder = new StringBuilder();
            xamlUIElementBuilder.Append("<Label xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' ");
            xamlUIElementBuilder.Append("Style='{ DynamicResource "   styleName   "}' ");
            xamlUIElementBuilder.Append("Background='Transparent' BorderThickness='0' IsHitTestVisible='false' ");
            xamlUIElementBuilder.Append("Width='"   Math.Abs(xOffset)   "' ");
            xamlUIElementBuilder.Append("Height='"   Math.Abs(yOffset)   "'/>");
            tmepLine = XamlReader.Parse(xamlUIElementBuilder.ToString()) as Label;

            drawCanvas.Children.Add(tmepLine);
            SetElementInCanvas(tmepLine, xOffset, yOffset, positionPoint, nowMovingPoint);
        }

        private void DrawToggleButton(Point nowMovingPoint, string styleName)
        {
            if (tempToggleButton != null)
            {
                drawCanvas.Children.Remove(tempToggleButton);
            }

            Point positionPoint = (Point)mouseLeftButtonDownPoint;

            double xOffset = nowMovingPoint.X - positionPoint.X;
            double yOffset = nowMovingPoint.Y - positionPoint.Y;

            StringBuilder xamlUIElementBuilder = new StringBuilder();
            xamlUIElementBuilder.Append("<ToggleButton xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' ");
            xamlUIElementBuilder.Append("Style='{ DynamicResource "   styleName   "}' ");
            xamlUIElementBuilder.Append("Background='Transparent' BorderThickness='0' IsHitTestVisible='false' ");
            xamlUIElementBuilder.Append("Width='"   Math.Abs(xOffset)   "' ");
            xamlUIElementBuilder.Append("Height='"   Math.Abs(yOffset)   "'/>");
            tempToggleButton = XamlReader.Parse(xamlUIElementBuilder.ToString()) as ToggleButton;
            drawCanvas.Children.Add(tempToggleButton);

            SetElementInCanvas(tempToggleButton, xOffset, yOffset, positionPoint, nowMovingPoint);
        }

        private void SetElementInCanvas(UIElement tempToggleButton, double xOffset, double yOffset, Point positionPoint, Point nowMovingPoint)
        {
            if (xOffset >= 0 && yOffset >= 0)
            {
                Canvas.SetLeft(tempToggleButton, positionPoint.X);
                Canvas.SetTop(tempToggleButton, positionPoint.Y);
            }
            else if (xOffset >= 0 && yOffset <= 0)
            {
                Canvas.SetLeft(tempToggleButton, positionPoint.X);
                Canvas.SetTop(tempToggleButton, nowMovingPoint.Y);
            }
            else if (xOffset <= 0 && yOffset >= 0)
            {
                Canvas.SetLeft(tempToggleButton, nowMovingPoint.X);
                Canvas.SetTop(tempToggleButton, positionPoint.Y);
            }
            else if (xOffset <= 0 && yOffset <= 0)
            {
                Canvas.SetLeft(tempToggleButton, nowMovingPoint.X);
                Canvas.SetTop(tempToggleButton, nowMovingPoint.Y);
            }
        }

        private string GetStraightConnectionLineStyleName(Point nowMovingPoint)
        {
            Point positionPoint = (Point)mouseLeftButtonDownPoint;

            double xOffset = nowMovingPoint.X - positionPoint.X;
            double yOffset = nowMovingPoint.Y - positionPoint.Y;
            string styleName = string.Empty;

            if (xOffset >= 0 && yOffset >= 0)
            {
                styleName = "BottomRightLineLabelStyle";
            }
            else if (xOffset >= 0 && yOffset <= 0)
            {
                styleName = "TopRightLineLabelStyle";
            }
            else if (xOffset <= 0 && yOffset >= 0)
            {
                styleName = "TopRightLineLabelStyle";
            }
            else if (xOffset <= 0 && yOffset <= 0)
            {
                styleName = "BottomRightLineLabelStyle";
            }

            return styleName;
        }

        private string GetLConnectionLineStyleName(Point nowMovingPoint)
        {
            Point positionPoint = (Point)mouseLeftButtonDownPoint;

            double xOffset = nowMovingPoint.X - positionPoint.X;
            double yOffset = nowMovingPoint.Y - positionPoint.Y;
            string styleName = string.Empty;

            if (xOffset >= 0 && yOffset >= 0)
            {
                styleName = "TRLConnectionLineLabelStyle";
            }
            else if (xOffset >= 0 && yOffset <= 0)
            {
                styleName = "BRLConnectionLineLabelStyle";
            }
            else if (xOffset <= 0 && yOffset >= 0)
            {
                styleName = "TLLConnectionLineLabelStyle";
            }
            else if (xOffset <= 0 && yOffset <= 0)
            {
                styleName = "BLLConnectionLineLabelStyle";
            }

            return styleName;
        }

        private void DrawLConnectionLine(Point nowMovingPoint)
        {
            //if (tempLConnectionLine != null)
            //{
            //    drawCanvas.Children.Remove(tempLConnectionLine);
            //}

            //tempLConnectionLine = new LConnectionLine();
            //tempLConnectionLine.IsHitTestVisible = false;
            //tempLConnectionLine.StartPoint = (Point)mouseLeftButtonDownPoint;
            //tempLConnectionLine.EndPoint = nowMovingPoint;
            //drawCanvas.Children.Add(tempLConnectionLine);
        }

        /// <summary>
        /// 修改页面元素大小,位置
        /// </summary>
        /// <param name="point">拖拽点</param>
        private void ModifyElement(Point point)
        {
            bool IsSelectedUIElement = false;
            foreach (UIElement item in drawCanvas.Children)
            {
                var startPoint = new Point(Canvas.GetLeft(item), Canvas.GetTop(item));
                if (point.X >= Canvas.GetLeft(item) && point.X <= Canvas.GetLeft(item)   item.RenderSize.Width && point.Y >= Canvas.GetTop(item) && point.Y <= Canvas.GetTop(item)   item.RenderSize.Height)
                {
                    IsSelectedUIElement = true;
                    ClearResizeMoveAdorner();
                    resizeMoveAdorner = new ResizeMoveAdorner(item);
                    selectedUIElement = item;
                    drawCanvasAdornerLayer.Add(resizeMoveAdorner);
                    break;
                }
            }

            if (!IsSelectedUIElement)
            {
                ClearResizeMoveAdorner();
            }
        }

        /// <summary>
        /// 当前画板清除修改元素装饰器
        /// </summary>
        private void ClearResizeMoveAdorner()
        {
            if (null != resizeMoveAdorner)
            {
                selectedUIElement = null;
                drawCanvasAdornerLayer.Remove(resizeMoveAdorner);
            }
        }

        private void SaveTrackLabel(string styleName)
        {
            var positionPoint = (Point)mouseLeftButtonDownPoint;

            StringBuilder xamlUIElementBuilder = new StringBuilder();
            xamlUIElementBuilder.Append("<Label xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' ");
            xamlUIElementBuilder.Append("Style='{ DynamicResource "   styleName   "}' ");
            xamlUIElementBuilder.Append("Background='Transparent' BorderThickness='0' IsHitTestVisible='false' ");
            xamlUIElementBuilder.Append("Width='"   tmepLine.Width   "' ");
            xamlUIElementBuilder.Append("Height='"   tmepLine.Height   "'/>");
            Label finalLabel = XamlReader.Parse(xamlUIElementBuilder.ToString()) as Label;


            //Label finalLabel = new Label();
            //finalLabel.Style = tmepLine.Style;
            //finalLabel.Width = tmepLine.Width;
            //finalLabel.Height = tmepLine.Height;
            //finalLabel.IsHitTestVisible = false;
            drawCanvas.Children.Add(finalLabel);
            Canvas.SetLeft(finalLabel, Canvas.GetLeft(tmepLine));
            Canvas.SetTop(finalLabel, Canvas.GetTop(tmepLine));

            drawCanvas.Children.Remove(tmepLine);
            tmepLine = null;
        }

        private void SaveToggleButton(string styleName)
        {
            var positionPoint = (Point)mouseLeftButtonDownPoint;

            StringBuilder xamlUIElementBuilder = new StringBuilder();
            xamlUIElementBuilder.Append("<ToggleButton xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' ");
            xamlUIElementBuilder.Append("Style='{ DynamicResource "   styleName   "}' ");
            xamlUIElementBuilder.Append("Background='Transparent' BorderThickness='0' IsHitTestVisible='false' ");
            xamlUIElementBuilder.Append("Width='"   tempToggleButton.Width   "' ");
            xamlUIElementBuilder.Append("Height='"   tempToggleButton.Height   "'/>");
            ToggleButton finalToggleButton = XamlReader.Parse(xamlUIElementBuilder.ToString()) as ToggleButton;
            drawCanvas.Children.Add(finalToggleButton);
            Canvas.SetLeft(finalToggleButton, Canvas.GetLeft(tempToggleButton));
            Canvas.SetTop(finalToggleButton, Canvas.GetTop(tempToggleButton));

            drawCanvas.Children.Remove(tempToggleButton);
            tempToggleButton = null;
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            drawCanvasAdornerLayer = AdornerLayer.GetAdornerLayer(drawCanvas);
            foreach (UIElement item in drawCanvas.Children)
            {
                item.IsHitTestVisible = false;
            }
        }

        #region 页面缩放
        private void ZoomBig_Click(object sender, RoutedEventArgs e)
        {
            drawCanvas.Scale  = 0.2;
        }

        private void ZoomIn_Clicked(object sender, RoutedEventArgs e)
        {
            drawCanvas.Scale -= 0.2;
        }

        private void ZoomBack_Clicked(object sender, RoutedEventArgs e)
        {
            drawCanvas.Scale = 1;
        }
        #endregion

        /// <summary>
        /// 用户选择选择工具
        /// 1.清理工具箱选择的工具
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ElementSelectTool_Checked(object sender, RoutedEventArgs e)
        {
            toolBox.SelectedItem = null;
            elementSelectTool.IsChecked = true;
        }

        /// <summary>
        /// 用户选择工具箱工具
        /// 1.清理选择,移动工具
        /// </summary>
        private void ToolBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            ClearSelectTool();
        }

        private void GraphicExportButton_Click(object sender, RoutedEventArgs e)
        {
            using (FileStream fs = new FileStream(@"F:\PicData.dat", FileMode.Create))
            {

                //当需要保存当前图形时,调用XamlWriter的以下方法将Canvas对象直接序列化到文件流中
                XamlWriter.Save(drawCanvas, fs);

                MessageBox.Show("数据已保存");
            }
        }

        private void GraphicImportButton_Clicked(object sender, RoutedEventArgs e)
        {
            string filePath = string.Empty;
            ImportGraphicFile importGraphicFile = new ImportGraphicFile();

            if (importGraphicFile.ShowDialog() == true)
            {
                filePath = importGraphicFile.ImportFilePath;
            }

            if (!string.IsNullOrEmpty(filePath))
            {
                using (FileStream fs = new FileStream(filePath, FileMode.Open))
                {
                    //double oldWidth = DrawPanelBorder.ActualWidth;
                    //double oldHeight = DrawPanelBorder.ActualHeight;
                    //调用XamlReader的方法从文件流中重建canvas对象
                    drawCanvasParent.Content = null;
                    drawCanvas = XamlReader.Load(fs) as ZoomableCanvas;
                    //CurCanvas.Width = oldWidth;
                    //CurCanvas.Height = oldHeight;                  
                    drawCanvasParent.Content = drawCanvas;

                }
            }
        }

        private void DrawCanvas_KeyUp(object sender, KeyEventArgs e)
        {

        }

        private void Window_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Delete && null != selectedUIElement)
            {
                drawCanvas.Children.Remove(selectedUIElement);
            }
        }

        private string GetToolStyleName(string toolName, Point nowMovingPoint)
        {
            string styleName = string.Empty;
            if (toolName == "straightConnectLine")
            {
                styleName = GetStraightConnectionLineStyleName(nowMovingPoint);
            }
            else if (toolName == "LConnectLine")
            {
                styleName = GetLConnectionLineStyleName(nowMovingPoint);
            }
            else if (toolName == "switchToolItem")
            {
                styleName = "SwitchToggleButtonStyle";
            }
            else if (toolName == "groundSwitchToolItem")
            {
                styleName = "GroundSwitchToggleButtonStyle";
            }
            else if (toolName == "platDoorToolItem")
            {
                styleName = "PlatDoorToggleButtonStyle";
            }
            else if (toolName == "electricConfirmToolItem")
            {
                styleName = "ElectricConfirmToggleButtonStyle";
            }
            else if (toolName == "trackLineToolItem")
            {
                styleName = "TrackLineLabelStyle";
            }
            else if (toolName == "electricBreakToolItem")
            {
                styleName = "LineBreakLabelStyle";
            }
            else if (toolName == "trackNameToolItem")
            {
                styleName = "TrackIDLabelStyle";
            }
            return styleName;
        }
    }
}

标签: 绘图 wpf

实例下载地址

wpf绘图程序 源码下载(绘图工具)

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警