<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. POJ1375 Intervals

    嘟嘟嘟 题意简述:给出一个光源\((x_0, y_0)\),和一些圆,求投影区间. 这道题其实就是求经过\((x_0, y_0)\))的圆的切线. 刚开始我想到了一个用向量旋转的方法,但是写起来特别麻 ...

  2. Mysql 用户权限管理--从 xxx command denied to user xxx

    今天遇到一个mysql 权限的问题,即标题所述  xxx command denied to user xxx,一般mysql 这种报错,基本都属于当前用户没有进行该操作的权限,需要 root 用户授 ...

  3. 将本地已经存在的非git项目提交到github上的空仓库

    一.本地项目执行操作 1.在本地项目目录下初始化git仓库 git init 2.将本地项目下工作区的所有文件添加到git版本库的暂存区中 git add . (可以创建.gitignore文件忽略不 ...

  4. Tomcat中的Filter

    Filter 节选部分源码.源码版本 Tomcat8.5 说明 filter 是 Servlet 规范 filter 是在 ,执行 Servlet.service方法之前执行 Filter相关接口 p ...

  5. Powerdesigner设置表字段注释与name相同

    Powerdesigner设置当表字段注释为空时与name相同 1.在Database-->edit Current DBMS-->script-->objects-->col ...

  6. 【.net开发者自学java系列】使用Eclipse开发SpringMVC(3)

    [.net开发者自学java系列]使用Eclipse开发SpringMVC(3) 标签(空格分隔): Spring RESTful 很久没继续学习java的spring了.接下来继续 回忆一下上个随笔 ...

  7. NOIP2018 Day2毒瘤题目

    Day2毒瘤题目 T1:travel 拿到题目,一看,图论,完了...... 仔细看了看题目,诶这个不是dfs序么?当场敲出dfs.跑样例一,过了,结果一跑样例二,当场废掉.(样例二有环,会跑不出正解 ...

  8. [USACO15DEC]最大流Max Flow(树链剖分,线段树)

    FJ给他的牛棚的N(2≤N≤50,000)个隔间之间安装了N-1根管道,隔间编号从1到N.所有隔间都被管道连通了. FJ有K(1≤K≤100,000)条运输牛奶的路线,第i条路线从隔间si运输到隔间t ...

  9. mysql的索引和执行计划

    一.mysql的索引 索引是帮助mysql高效获取数据的数据结构.本质:索引是数据结构 1:索引分类 普通索引:一个索引只包含单个列,一个表可以有多个单列索引. 唯一索引:索引列的值必须唯一 ,但允许 ...

  10. 使用babel插件集

    1).打开配置文件".babelrc",配置插件集,代码如下: { "presets":["latest"] } 2).安装babel插件集 ...