WPF的装饰者有什么意义?

问题描述

| 我最近为我的公司开发了一个绘图组件,其中包含一个Canvas,您可以使用单击并拖动在其上绘制某些形状。对于每种形状,我在其AdornerLayer上放置了两个装饰物:一个用于增加命中检测(基本上是一个透明的矩形,它将超出该形状的边界几个像素),另一个用于调整大小(在拐角处有四个Thumb控件)。 但是,在实现组件的某些功能(与装饰有关)时,我遇到了许多问题。 他们捕获了所有预览事件,因为它们位于Canvas本身之外的另一棵可视树中,这是出乎意料的,但是我找到了一种解决方法,即使我不太喜欢它也是如此。使用AdornerDecorator不能解决此问题,我实现的选择装饰器是预览事件的黑洞。 当我在画布上实施形状的z-index操纵(发送回去,放到最前面等)时,如您所料,使用Panel.SetZIndex可以正常工作。但是,装饰者在另一棵视觉树中!因此它们不会受到影响,并且选择装饰器仍然位于所有其他形状的顶部,即使这些形状位于选择装饰器正在检测命中的形状的顶部。 例如: Shape1,SelectionAdorner1。 Shape2,SelectionAdorner2。 Shape1位于Shape2的顶部(稍后添加到画布上),因此它与它重叠。因此,SelectionAdorner1将检测到单击它。我操纵了ZIndex将其发送回去,现在Shape2在顶部并与Shape1重叠。我单击Shape2的顶部,但单击是由SelectionAdorner1而不是SelectionAdorner2检测到的。 这特别烦人。因此,显然,由于装饰者在另一棵视觉树上,因此他们不尊重ZIndexes。我试图通过在形状的ZIndex及其SelectionAdorner的ZIndex之间创建DataBinding(以及手动设置)来解决此问题。但这并没有解决问题。更改装饰者的ZIndex并不会影响它们在屏幕上的显示方式,也许我错过了一些东西,但这并不应该那么难,因为应该使装饰者变得更容易。我唯一能想到的解决方案是手动删除所有装饰器,然后手动逐个手动添加它们,最后添加一个应该放在最前面的装饰器。那是弱智,但行得通。 接下来,装饰者不尊重ClipToBounds!我在进行绘图的Canvas中将ClipToBounds = true设置为true,但效果很好,但该死的装饰师仍然可以使用!解决此问题的方法相对简单,我只是在每个Shape的顶部添加了一个AdornerDecorator。这不是IMO的理想解决方案,但是很简单。 装饰者并不总是对在其装饰元素上执行的LayoutTransforms反应良好。我在画布顶部有一个面板,该面板实现了缩放和平移功能。它使用动画使放大和缩小更加平滑。但是使用动画会使我的装饰者变得猿!他们在第一个缩放中将完全忽略调整大小并保持相同的大小和位置,在第二个缩放中,它们将缩放为装饰元素的先前大小。那没有任何意义!我唯一能找到的解决方案是禁用动画,值得庆幸的是, 我不太记得我还有哪些其他问题,但这足以使我怀疑Adorners的有用性,我正认真考虑在我的下一个项目中不使用它们,这与该项目类似我描述过 因此,有人可以告诉我使用这些看似有用但令人讨厌的东西的优点吗? 谢谢。     

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)