在WPF中自定义你的绘制(一)

原文:在WPF中自定义你的绘制(一)

  在WPF中自定义你的绘制(一)
                                                                    周银辉

        在传统的Windows窗体编程中,如果我们需要打造一些比较个性化的控件,那么我们常常需要自定义控件的绘制(重写OnPaint等),即需要经常用到Graphics对象。而在WPF中,我们可以使用Xaml轻松编写出很有特色的界面元素,似乎与以前的以前利用Graphics对象手写代码绘制控件的日子越来越远了。其实在WPF中,如果我们需要低级别的自定义绘制同样是可以的,那么我们就需要一个名DrawingContext的类。与OnPaint方法相对应的是OnRender方法(当然,你也可以在其他地方进行绘制)。
        在UIElement.OnRender( DrawingContext drawingContext )方法中,直接提供了DrawingContext 对象,我们可以利用它像以前的Graphics对象一样进行各式各样的绘制操作,值得注意的是一下几点:
        1,在我们的代码中,我们不能直接调用OnRender方法,它将被系统异步调用进行布局和绘制(这与Win32不同)。
        2,我们不能直接创建DrawingContext实例,但我们可以利用 DrawingGroup.Open 和DrawingVisual.RenderOpen来得到。    
        3,我们的绘制不是实时的,事实上我们的绘制将被保存到一个绘制指令集中被图形 系统在某个时候调用。   

参考如下代码,我们重新定义的一个Canvas的绘制:

在WPF中自定义你的绘制(一)using System;
在WPF中自定义你的绘制(一)using System.Collections.Generic;
在WPF中自定义你的绘制(一)using System.Text;
在WPF中自定义你的绘制(一)using System.Windows.Controls;
在WPF中自定义你的绘制(一)using System.Windows.Media;
在WPF中自定义你的绘制(一)using System.Windows;
在WPF中自定义你的绘制(一)using System.Globalization;
在WPF中自定义你的绘制(一)
在WPF中自定义你的绘制(一)namespace CustomPaint
在WPF中自定义你的绘制(一)在WPF中自定义你的绘制(一)在WPF中自定义你的绘制(一){
在WPF中自定义你的绘制(一)    class MyCanvas : Canvas
在WPF中自定义你的绘制(一)在WPF中自定义你的绘制(一)    在WPF中自定义你的绘制(一){
在WPF中自定义你的绘制(一)        protected override void OnRender(DrawingContext dc)
在WPF中自定义你的绘制(一)在WPF中自定义你的绘制(一)        在WPF中自定义你的绘制(一){
在WPF中自定义你的绘制(一)            base.OnRender(dc);
在WPF中自定义你的绘制(一)
在WPF中自定义你的绘制(一)            dc.DrawRectangle(Brushes.LightBlue, new Pen(Brushes.Red, 1), 
在WPF中自定义你的绘制(一)                new Rect(new Point(10, 10), new Size(100, 50)));
在WPF中自定义你的绘制(一)
在WPF中自定义你的绘制(一)            dc.DrawText(new FormattedText("my canvas", CultureInfo.CurrentCulture, 
在WPF中自定义你的绘制(一)                FlowDirection.LeftToRight, new Typeface("Tahoma"), 20, Brushes.Green),
在WPF中自定义你的绘制(一)                new Point(50,25));
在WPF中自定义你的绘制(一)        }
在WPF中自定义你的绘制(一)    }
在WPF中自定义你的绘制(一)}
在WPF中自定义你的绘制(一)

效果如下:
在WPF中自定义你的绘制(一) 

在《在WPF中自定义你的绘制(二)》中我们将更深入地阐述在WPF中如何进行自定义绘制,谢谢。

上一篇:Java通过socket实现smtp协议发送邮件


下一篇:洛谷 3953 NOIP2017提高组Day1 T3 逛公园