基本信息
源码名称:wpf绘图程序 源码下载(绘图工具)
源码大小:0.36M
文件格式:.rar
开发语言:C#
更新时间:2016-06-21
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 2 元 
   源码介绍

【实例介绍】

绘图程序

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;
        }
    }
}