您的位置:首页 > 移动开发 > Objective-C

Visual Layer Overview(6)Using DrawingVisual Objects

2006-06-14 21:43 246 查看
UsingDrawingVisualObjects
这部分提供了怎样使用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]
·ArrangeOverride:Positionsthechildelementanddeterminessize.
·GetVisualChild:Returnsachildatthespecifiedindexfromthecollectionofchildelements.
·MeasureOverride:Measuresanddeterminesthesizeinlayoutrequiredforthechildelement.
·VisualChildrenCount:Getsthenumberofvisualchildelementswithinthiselement.
例子代码:
//<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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: