Visual Layer Overview(6)Using DrawingVisual Objects

翻译 2006年06月14日 21:43:00
这部分提供了怎样使用DrawingVisual对象的概要说明
1.        DrawingVisual Object
DrawingVisual是一个用来渲染shapes, images, 或者text的轻量级的类这个类之所以被认为是轻量级的,是因为它没有提供layout 或者event handling,所以增加了它的运行时性能。正是因为这个原因,描画backgrounds clip art是非常理想的。
为了使用DrawingVisual对象,需要创建一个对象的host containerhost container对象必须从提供了layout event handlingFrameworkElement class继承,而DrawingVisual对象没有提供layout event handlinghost container对象不提供任何的显示属性,因为它的主要目的是包含其他的子对象。
当为visual objects创建host container对象时,需要保存visual objects对象的引用到一个VisualCollection中,使用Add 方法添加,参见下面的例子:
// Create a host visual derived from the FrameworkElement class.
// This class provides layout, event handling, and container support for
// the child visual objects.
public class MyVisualHost : FrameworkElement
{
    // Create a collection of child visual objects.
    private VisualCollection _children;
    public MyVisualHost()
    {
        _children = new VisualCollection(this);
        _children.Add(CreateDrawingVisualRectangle());
        _children.Add(CreateDrawingVisualText());
        _children.Add(CreateDrawingVisualEllipses());
        this.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(MyVisualHost_MouseLeftButtonUp);
    }
3.        Creating DrawingVisual Objects
当创建DrawingVisual对象时,它不包含任何描画内容。通过得到对象的描画上下文,可以添加text, graphic, image 内容。对象的描画上下文调用DrawingVisual对象的RenderOpen方法可以得到。
在描画上下文中描画矩形,使用DrawingContext 对象的DrawRectangle方法,当结束DrawingContext的描画内容时,调用Close方法关闭描画上下文中
下面的例子中,DrawingVisual对象被创建,在它的描画上下文中绘制了一个矩形
// Create a DrawingVisual that contains a rectangle.
private DrawingVisual CreateDrawingVisualRectangle()
{
    DrawingVisual dv = new DrawingVisual();
    DrawingContext dc = dv.RenderOpen();
    Rect r = new Rect(new Point(160, 100), new Size(320, 80));
    dc.DrawRectangle(Brushes.LightBlue, (Pen)null, r);
    dc.Close();
    return dv;
}
4.        Creating Overrides for FrameworkElement Members
Host container对象负责管理visual objects的集合。这需要Host container实现(overrides)从继承FrameworkElement class的一些方法
下面列出了必须override的四个方法
·                       ArrangeOverride: Positions the child element and determines size.
·                       GetVisualChild: Returns a child at the specified index from the collection of child elements.
·                       MeasureOverride: Measures and determines the size in layout required for the child element.
·                       VisualChildrenCount: Gets the number of visual child elements within this element.
例子代码:
//<Snippet102a>
// Provide a required override for the VisualChildCount property.
protected override int VisualChildrenCount
{
    get { return _children.Count; }
}
 
// Provide a required override for the GetVisualChild method.
protected override Visual GetVisualChild(int index)
{
    if (index < 0 || index > _children.Count)
    {
        throw new ArgumentOutOfRangeException();
    }
 
    return (Visual)_children[index];
}
 
// Provide a required override for the MeasureOverride method.
protected override Size MeasureOverride(Size availableSize)
{
    // Return the value of the parameter.
    return base.MeasureOverride(availableSize);
}
 
// Provide a required override for the ArrangeOverride method.
protected override Size ArrangeOverride(Size finalSize)
{
    // Return the value of the parameter.
    return base.ArrangeOverride(finalSize);
}
5.        Providing Hit Testing Support
Host container对象虽然没有提供显示的属性,但是提供了event handling。这使得可以创建event handling routine来处理鼠标事件,例如:release鼠标左键,event handling routine还可以通过调用HitTest方法实现碰撞检测
示例代码:
// Capture the mouse event and hit test the coordinate point value against
// the child visual objects.
void MyVisualHost_MouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
    // Retreive the coordinates of the mouse button event.
    Point pt = e.GetPosition((UIElement)sender);
 
    // Initiate the hit test by setting up a hit test result callback method.
    VisualTreeHelper.HitTest(this, null, new HitTestResultCallback(myCallback), new PointHitTestParameters(pt));
}
 
// If a child visual object is hit, toggle its opacity to visually indicate a hit.
public HitTestResultBehavior myCallback(HitTestResult result)
{
    if (result.VisualHit.GetType() == typeof(DrawingVisual))
    {
        if (((DrawingVisual)result.VisualHit).Opacity == 1.0)
        {
            ((DrawingVisual)result.VisualHit).Opacity = 0.4;
        }
        else
        {
            ((DrawingVisual)result.VisualHit).Opacity = 1.0;
        }
    }
 
    // Stop the hit test enumeration of objects in the visual tree.
    return HitTestResultBehavior.Stop;
}
 

#233 – DrawingVisual类的一个例子

当需要一个低级别的控件来绘制若干2D图形的时候,你可以通过自定义一个继承自DrawingVisual 的类来实现。 下面的一个例子是通过一个继承自DrawingVisual 的类来显示两个图形的简单实...
  • Libby1984
  • Libby1984
  • 2016年08月25日 14:40
  • 836

DrawingVisual绘图

DrawingVisual无法单独存在,必须放在一个容器中(需要有布局系统)呈现.我们看到每次添加一个Visual的时候,总还是难免要实现GetVisualChild和VisualChildrenCo...
  • rrzhaobaojun
  • rrzhaobaojun
  • 2013年12月25日 15:00
  • 1664

WPF DrawingVisual详解

代码如下:     public partial class MainWindow : Window     {         private DrawingVisual _drawingVisua...
  • wcc27857285
  • wcc27857285
  • 2016年09月19日 11:22
  • 993

wpf轻量绘图DrawingVisual

wpf内置提供了Ellipse等标签画图形,不仅如此而且还提供了许多的事件(因为其继承自FrameworkElement).在某些情况下,我们可以不采用这些标签仅仅用于呈现,并不复杂的操作(没有事...
  • clingingboy
  • clingingboy
  • 2008年06月04日 12:06
  • 570

Visual Layer Overview(2)--Visual Tree

visual tree包含一个应用UI中所有的可视化的元素(visual elements)。既然一个可视化元素中包含永久化的描画信息,可以认为visual tree是一个包含组成显示设备上输出的所有...
  • Net_Ghost
  • Net_Ghost
  • 2006年06月09日 17:36
  • 1192

Visual Layer Overview(1)--Role of the Visual Object

     Visual object是Windows Presentation Foundation的核心对象,它的主要作用就是对渲染的支持。UI controls,例如:Button和TextBox...
  • Net_Ghost
  • Net_Ghost
  • 2006年06月09日 16:51
  • 1381

Visual Layer Overview(5)Hit Testing in the Visual Layer

Hit Testing in the Visual Layer 这部分介绍了Windows Presentation Foundation中visual layer.使用VisualTreeHelpe...
  • Net_Ghost
  • Net_Ghost
  • 2006年06月13日 00:49
  • 1424

Wpf跑马灯——DrawingVisual运用

本文将建立一个wpf项目中运用DrawingVisual绘制跑马灯效果的简单实例,以下是详细步骤: 新建一个wpf项目,添加演示用图片,修改图片属性为"如果较新则复制"。 在Mai...
  • xwlyun
  • xwlyun
  • 2013年06月23日 20:49
  • 1363

#234 – 在窗体上显示DrawingVisual 实例(Getting a DrawingVisual Object Rendered in a Window)

一个继承自DrawingVisual 类的实例需要寄宿在其他类型的实例上才能在窗体或者页面上显示。 这些低级别的控件可以在 UIElement 或者FrameworkElement 上寄宿(也就是通过...
  • Libby1984
  • Libby1984
  • 2016年08月25日 14:57
  • 341

findbugs异常(3):Comparison of String objects using == or !=

1. 官方说明:Comparison of String objects using == or !=This code compares java.lang.String objects for r...
  • baidu_30809315
  • baidu_30809315
  • 2018年01月02日 14:53
  • 35
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Visual Layer Overview(6)Using DrawingVisual Objects
举报原因:
原因补充:

(最多只允许输入30个字)