<Window x:Class="WPFDrawing.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WPFDrawing"
mc:Ignorable="d"
Title="MainWindow"
Height=""
Width="">
<Grid>
<Grid.RowDefinitions> <RowDefinition Height="*" />
<RowDefinition Height="" />
</Grid.RowDefinitions>
<local:DrawingCanvas x:Name="drawCanvas"
Background="LightGray"
MouseLeftButtonDown="drawCanvas_MouseLeftButtonDown"
MouseMove="drawCanvas_MouseMove"> </local:DrawingCanvas>
<Button Content="test"
Width=""
Grid.Row=""
Click="Button_Click"></Button>
</Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes; namespace WPFDrawing
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Button_Click(null, null);
} private void Button_Click(object sender, RoutedEventArgs e)
{
var pts = new PointCollection();
pts.Add(new Point() { X = , Y = });
pts.Add(new Point() { X = , Y = });
Visual vs = drawCanvas.Polyline(pts, Brushes.Red, );
drawCanvas.AddVisual(vs);
} private void drawCanvas_MouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
var p = e.GetPosition(null);
if (vs != null)
{
drawCanvas.NewLine(vs, new Point() { X = , Y = }, p);
}
Console.WriteLine(p.X + " " + p.Y);
}
} DrawingVisual vs = null; private void drawCanvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
var p = e.GetPosition(null);
Console.WriteLine(p.X + " " + p.Y);
vs = drawCanvas.GetVisual(p);
if (vs != null)
{
Console.WriteLine("已经选中了。。。。。");
}
}
}
}
using System.Collections.Generic;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows; namespace WPFDrawing
{
public class DrawingCanvas : Canvas
{
private List<Visual> visuals = new List<Visual>(); //获取Visual的个数
protected override int VisualChildrenCount
{
get { return visuals.Count; }
} //获取Visual
protected override Visual GetVisualChild(int index)
{
return visuals[index];
} //添加Visual
public void AddVisual(Visual visual)
{
visuals.Add(visual); base.AddVisualChild(visual);
base.AddLogicalChild(visual);
} //删除Visual
public void RemoveVisual(Visual visual)
{
visuals.Remove(visual); base.RemoveVisualChild(visual);
base.RemoveLogicalChild(visual);
} //命中测试
public DrawingVisual GetVisual(Point point)
{
HitTestResult hitResult = VisualTreeHelper.HitTest(this, point);
return hitResult.VisualHit as DrawingVisual;
} //使用DrawVisual画Polyline
public Visual Polyline(PointCollection points, Brush color, double thinkness)
{
DrawingVisual visual = new DrawingVisual();
DrawingContext dc = visual.RenderOpen();
Pen pen = new Pen(Brushes.Red, );
pen.Freeze(); //冻结画笔,这样能加快绘图速度 for (int i = ; i < points.Count - ; i++)
{
dc.DrawLine(pen, points[i], points[i + ]);
} dc.Close();
return visual;
} public void NewLine(DrawingVisual visual, Point ps, Point pd)
{
DrawingContext dc = visual.RenderOpen();
Pen pen = new Pen(Brushes.Red, );
pen.Freeze(); //冻结画笔,这样能加快绘图速度
dc.DrawLine(pen, ps, pd);
dc.Close();
} }
}

自定义流程图线段拖动改变长短,只是提供一种思路。

WPF DrawingContext Pen的更多相关文章

  1. WPF 如何画出1像素的线

    如何有人告诉你,请你画出1像素的线,是不是觉得很简单,实际上在 WPF 上还是比较难的. 本文告诉大家,如何让画出的线不模糊 画出线的第一个方法,创建一个 Canvas ,添加一个线 界面代码 < ...

  2. WPF 绘制对齐像素的清晰显示的线条

    此前有小伙伴询问我为何他 1 像素的线条显示发虚,然后我告诉他是“像素对齐”的问题,然而他设置了各种对齐像素的属性依旧没有作用.于是我对此进行了一系列试验,对 WPF 像素对齐的各种方法进行了一次总结 ...

  3. 2018-8-10-win10-uwp-气泡

    title author date CreateTime categories win10 uwp 气泡 lindexi 2018-08-10 19:16:50 +0800 2018-2-13 17: ...

  4. WPF的二维绘图(一)——DrawingContext

    DrawingContext比较类似WinForm中的Graphics 类,是基础的绘图对象,用于绘制各种图形,它主要API有如下几种: 绘图API 绘图API一般形为DrawingXXX系列,常用的 ...

  5. 基于C#在WPF中使用斑马打印机进行打印【转】

    原文链接:http://ju.outofmemory.cn/entry/132476 最近在项目中接手了一个比较有挑战性的模块——用斑马打印机将需要打印的内容打印出来.苦苦折腾了两天,总算有所收获,就 ...

  6. WPF自定义空心文字

    首先创建一个自定义控件,继承自FrameworkElement,“Generic.xaml”中可以不添加样式. 要自定义空心文字,要用到绘制格式化文本FormattedText类.FormattedT ...

  7. WPF画线问题,几千条以后就有明显的延迟了。

      我现在是这么画的,class A { private GeometryGroup _lines; private Path _path; public A() {    _path.Data = ...

  8. WPF技巧-Canvas转为位图

    转自:http://www.cnblogs.com/tmywu/archive/2010/09/14/1825650.html 在WPF中我们可以将Canvas当成一种画布,将Canvas中的控件当成 ...

  9. WPF打印原理,自定义打印

    一.基础知识 1.System.Printing命名空间 我们可以先看一下System.Printing命名空间,东西其实很多,功能也非常强大,可以说能够控制打印的每一个细节,曾经对PrintDial ...

随机推荐

  1. UVA10125 Sumsets

    嘟嘟嘟 很简单的折半搜索. 把式子变一下型,得到\(a + b = d - c\). 然后枚举\(a, b\),存到\(map\)里,再枚举\(c, d\)就好了. \(map\)以\(a,b\)两数 ...

  2. POJ2318 TOYS

    嘟嘟嘟 题面:先告诉你一个矩形抽屉的坐标,然后\(n\)个隔板将抽屉分成了\(n + 1\)格(格子从\(0\)到\(n - 1\)标号),接下来随机输入\(m\)个玩具的坐标.问最后每一个格子里有多 ...

  3. ascll方便查询

  4. LeetCode刷题(数据库)---- 超过5名学生的课

    题:请列出所有超过或等于5名学生的课. 有一个courses 表 ,有: student (学生) 和 class (课程). 例如,表: +---------+------------+ | stu ...

  5. UGA,PGA

    tom认为UGA不包含 sort工作区,所以下面的图都是错误的 The UGA is, in effect, your session’s state. It is memory that your ...

  6. 位图索引对于DML操作的影响

    位图索引相对于常规的B-tree 索引,有着体积更加小的优势,节省空间.对于重复率特别高的字段,比如性别,比如省份.查询效率要优于B-tree 索引.那为什么我们总被告知在业务库中不要使用呢? 业务库 ...

  7. oracle中如何将表缓存到内存中

    oracle快速将表缓存到内存中,使得访问速度加快. 共有2种方法:   1)alter table fisher cache; 2)alter table fisher storage(buffer ...

  8. JAVA项目服务器部署

    1.下载 Java JDK 搜索jdk下载,然后进入JAVA官方网站jdk下载页,选择自己的对应的操作系统,点击下载 https://www.oracle.com/technetwork/java/j ...

  9. vue组件中,iview的modal组件爬坑--modal的显示与否应该是使用v-show

    这是我第一次写博客,主要是记录下自己解决问题的过程和知识的总结,如有不对的地方欢迎指出来! 需求:点击btn,弹出modal显示图表(以折现图为例) 这应该是很基本的需求也是很容易实现的,代码和效果如 ...

  10. nginx 源码安装以及后续升级https

    事情的来源是,公司要将网站从http升级到https,由于历史遗留原因,才发现现有的nginx是通过源码安装的,并没有安装ssl模块,需要现安装sll模块,这个nginx是整个公司最前端的一个代理,涉 ...