实例介绍
【实例介绍】
绘图程序
【实例截图】

【核心代码】
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;
}
}
}
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论