Fork me on GitHub

林德熙

If you have any language confusion,please talk to me lindexi_gd@163.com.

WPF DrawingVisual

本文:如何自定义控件用 DrawingVisual 画图

本文不会讲 DrawingVisual 是什么,只会告诉简单方法画图。

为何需要学这个,如果需要画出图形,对性能有要求,了解WPF如何画图,就需要知道这个。

先创建最简单使用,就是显示文字或显示点。

我觉得显示文字简单,于是开始写代码,先不要去想做什么

首先新建一个控件,他是可以让 DrawingVisual 显示。

    public class MyVisualHost : FrameworkElement

这是很基础一个类,几乎没有什么功能。

于是新建一个 FrameworkElement 需要添加 一些方法

这个类不是主要的,他是让DrawingVisual显示,在构造函数写

这就是可以让 他可以显示。为何这样可以,参见:http://blog.csdn.net/changtianshuiyue/article/details/26981797

主要的类StrokeVisual,其实很简单

        public class StrokeVisual : DrawingVisual

来看下他的方法

这样就可以画出文字。

需要在xaml添加

            <local:MyVisualHost></local:MyVisualHost>

为什么这样就可以画出?

那么如何做一个鼠标点下就画点的软件?

调用 RenderOpen 就可以打开一个 DrawingContext ,他提供很多方法,在他上面使用就可以画出,不过画出来看不到。需要添加到FrameworkElement才可以。

那么如何做出下图的程序?

首先对代码做修改,在 Windows 的MouseMove 调用 StrokeVisual 的 Add 方法和 画出来

需要获得鼠标的位置

    p=e.GetPosition(this);

传入 StrokeVisual

            _s.Add(new StylusPoint(p.X, p.Y));
            _s.Draw();
        public StrokeVisual()
        {
            Stroke = new Stroke(new StylusPointCollection(new Point[] { new Point(10, 10), }), new DrawingAttributes()
            {
            });


        }

        public void Add(StylusPoint point)
        {
            Stroke.StylusPoints.Add(point);
        }

        private Stroke Stroke;

那么如何从 Stroke 画出?

可以使用

            using (var dc = RenderOpen())
            {
                Stroke.Draw(dc);
            }

Stroke 传入 dc 就可以画出来。

本文会经常更新,请到原文:/lindexi/post/WPF-DrawingVisual/,避免陈旧错误知识的误导,同时有更好的阅读体验。

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系