Visual Layer Overview(6)Using DrawingVisual Objects
2006-06-14 21:43
246 查看
UsingDrawingVisualObjects
1.DrawingVisualObject
[align=left]DrawingVisual是一个用来渲染shapes,images,或者text的轻量级的类这个类之所以被认为是轻量级的,是因为它没有提供layout或者eventhandling,所以增加了它的运行时性能。正是因为这个原因,描画backgrounds和clipart是非常理想的。[/align]
2.DrawingVisualHostContainer
[align=left]为了使用DrawingVisual对象,需要创建一个对象的hostcontainer。hostcontainer对象必须从提供了layout和eventhandling的FrameworkElementclass继承,而DrawingVisual对象没有提供layout和eventhandling。hostcontainer对象不提供任何的显示属性,因为它的主要目的是包含其他的子对象。[/align]
当为visualobjects创建hostcontainer对象时,需要保存visualobjects对象的引用到一个VisualCollection中,使用Add方法添加,参见下面的例子:
}
3.CreatingDrawingVisualObjects
[align=left]当创建DrawingVisual对象时,它不包含任何描画内容。通过得到对象的描画上下文,可以添加text,graphic,和image内容。对象的描画上下文调用DrawingVisual对象的RenderOpen方法可以得到。[/align]
[align=left]在描画上下文中描画矩形,使用DrawingContext对象的DrawRectangle方法,当结束DrawingContext的描画内容时,调用Close方法关闭描画上下文中[/align]
下面的例子中,DrawingVisual对象被创建,在它的描画上下文中绘制了一个矩形
}
4.CreatingOverridesforFrameworkElementMembers
[align=left]Hostcontainer对象负责管理visualobjects的集合。这需要Hostcontainer实现(overrides)从继承FrameworkElementclass的一些方法[/align]
[align=left]下面列出了必须override的四个方法[/align]
·ArrangeOverride:Positionsthechildelementanddeterminessize.
·GetVisualChild:Returnsachildatthespecifiedindexfromthecollectionofchildelements.
·MeasureOverride:Measuresanddeterminesthesizeinlayoutrequiredforthechildelement.
·VisualChildrenCount:Getsthenumberofvisualchildelementswithinthiselement.
例子代码:
}
5.ProvidingHitTestingSupport
Hostcontainer对象虽然没有提供显示的属性,但是提供了eventhandling。这使得可以创建eventhandlingroutine来处理鼠标事件,例如:release鼠标左键,eventhandlingroutine还可以通过调用HitTest方法实现碰撞检测
示例代码:
}
这部分提供了怎样使用DrawingVisual对象的概要说明
1.DrawingVisualObject
[align=left]DrawingVisual是一个用来渲染shapes,images,或者text的轻量级的类这个类之所以被认为是轻量级的,是因为它没有提供layout或者eventhandling,所以增加了它的运行时性能。正是因为这个原因,描画backgrounds和clipart是非常理想的。[/align]
2.DrawingVisualHostContainer
[align=left]为了使用DrawingVisual对象,需要创建一个对象的hostcontainer。hostcontainer对象必须从提供了layout和eventhandling的FrameworkElementclass继承,而DrawingVisual对象没有提供layout和eventhandling。hostcontainer对象不提供任何的显示属性,因为它的主要目的是包含其他的子对象。[/align]
当为visualobjects创建hostcontainer对象时,需要保存visualobjects对象的引用到一个VisualCollection中,使用Add方法添加,参见下面的例子:
//CreateahostvisualderivedfromtheFrameworkElementclass.
//Thisclassprovideslayout,eventhandling,andcontainersupportfor
//thechildvisualobjects.
publicclassMyVisualHost:FrameworkElement
{
//Createacollectionofchildvisualobjects.
privateVisualCollection_children;
publicMyVisualHost()
{
_children=newVisualCollection(this);
_children.Add(CreateDrawingVisualRectangle());
_children.Add(CreateDrawingVisualText());
_children.Add(CreateDrawingVisualEllipses());
this.MouseLeftButtonUp+=newSystem.Windows.Input.MouseButtonEventHandler(MyVisualHost_MouseLeftButtonUp);
}
3.CreatingDrawingVisualObjects
[align=left]当创建DrawingVisual对象时,它不包含任何描画内容。通过得到对象的描画上下文,可以添加text,graphic,和image内容。对象的描画上下文调用DrawingVisual对象的RenderOpen方法可以得到。[/align]
[align=left]在描画上下文中描画矩形,使用DrawingContext对象的DrawRectangle方法,当结束DrawingContext的描画内容时,调用Close方法关闭描画上下文中[/align]
下面的例子中,DrawingVisual对象被创建,在它的描画上下文中绘制了一个矩形
//CreateaDrawingVisualthatcontainsarectangle.
privateDrawingVisualCreateDrawingVisualRectangle()
{
DrawingVisualdv=newDrawingVisual();
DrawingContextdc=dv.RenderOpen();
Rectr=newRect(newPoint(160,100),newSize(320,80));
dc.DrawRectangle(Brushes.LightBlue,(Pen)null,r);
dc.Close();
returndv;
}
4.CreatingOverridesforFrameworkElementMembers
[align=left]Hostcontainer对象负责管理visualobjects的集合。这需要Hostcontainer实现(overrides)从继承FrameworkElementclass的一些方法[/align]
[align=left]下面列出了必须override的四个方法[/align]
·
·
·
·
例子代码:
//<Snippet102a>
//ProvidearequiredoverridefortheVisualChildCountproperty.
protectedoverrideintVisualChildrenCount
{
get{return_children.Count;}
}
//ProvidearequiredoverridefortheGetVisualChildmethod.
protectedoverrideVisualGetVisualChild(intindex)
{
if(index<0||index>_children.Count)
{
thrownewArgumentOutOfRangeException();
}
return(Visual)_children[index];
}
//ProvidearequiredoverridefortheMeasureOverridemethod.
protectedoverrideSizeMeasureOverride(SizeavailableSize)
{
//Returnthevalueoftheparameter.
returnbase.MeasureOverride(availableSize);
}
//ProvidearequiredoverridefortheArrangeOverridemethod.
protectedoverrideSizeArrangeOverride(SizefinalSize)
{
//Returnthevalueoftheparameter.
returnbase.ArrangeOverride(finalSize);
}
5.ProvidingHitTestingSupport
Hostcontainer对象虽然没有提供显示的属性,但是提供了eventhandling。这使得可以创建eventhandlingroutine来处理鼠标事件,例如:release鼠标左键,eventhandlingroutine还可以通过调用HitTest方法实现碰撞检测
示例代码:
//Capturethemouseeventandhittestthecoordinatepointvalueagainst
//thechildvisualobjects.
voidMyVisualHost_MouseLeftButtonUp(objectsender,System.Windows.Input.MouseButtonEventArgse)
{
//Retreivethecoordinatesofthemousebuttonevent.
Pointpt=e.GetPosition((UIElement)sender);
//Initiatethehittestbysettingupahittestresultcallbackmethod.
VisualTreeHelper.HitTest(this,null,newHitTestResultCallback(myCallback),newPointHitTestParameters(pt));
}
//Ifachildvisualobjectishit,toggleitsopacitytovisuallyindicateahit.
publicHitTestResultBehaviormyCallback(HitTestResultresult)
{
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;
}
}
//Stopthehittestenumerationofobjectsinthevisualtree.
returnHitTestResultBehavior.Stop;
}
相关文章推荐
- Visual Layer Overview(2)--Visual Tree
- Visual Layer Overview(5)Hit Testing in the Visual Layer
- A Data Access Layer to persist business objects using attributes and reflection - Part I [无常译]
- Visual Layer Overview(3)--VisualTreeHelper Class
- Visual Layer Overview(4)--Other Visual Object Classes
- A Data Access Layer to persist business objects using attributes and reflection - Part I
- Using multiple CGLayer objects to draw a flag
- A Data Access Layer to persist business objects using attributes and reflection - Part II [无常译]
- A Data Access Layer to persist business objects using attributes and reflection - Part III [无常译]
- Visual Layer Overview(1)--Role of the Visual Object
- A Data Access Layer to persist business objects using attributes and reflection - Part III
- 使用Visual Studio调试用户模式进程(Debugging a User-Mode Process Using Visual Studio)
- Computing for Numerical Methods Using Visual C++ (Hardcover), Dec.2007.eBook-BBL
- Core Animation Programming Guide - Setting up layer objects
- How to automate PowerPoint by using Visual C++ 5.0 or Visual C++ 6.0 with The Microsoft Foundation Classes
- Using closures as objects in R
- Using Visual Studio with Open CASCADE
- c# Using Settings under visual studio 2012
- Using Visual Studio to Develop Native Android Code
- Using Record Objects as Parameters and Returns