用于在 XAML 中定义装饰器的可重用附加行为
解释如何实现和使用这个强大的行为
引言
本文介绍了一种附加行为技术,我刚用它在XAML中定义WPF装饰器。 该技术基于Ashley Davis的文章,该文章也解释了如何在XAML中定义WPF装饰器。 但我仍然想更进一步。 一些更改(有些只是我喜欢的)和改进是
- 用一个
static
行为类替换定义的Adorned Control - 在
AdornerPlacement enum
中添加一个新成员,即Across - 最重要的是,添加对多个
Adorner
Child的支持
主类是MultiChildAdornerBehavior
,它是一个包含一些AttachedProperty
定义的static
助手类。 要装饰的对象保持不变。 只需添加一些AttachedProperties
即可使整个事情起飞。 至于FrameworkElementMultiChildAdorner
类,它只是Ashley的礼物的修改。
我包含了一个简单的项目来配合本文。 我认为该示例足以证明本文中描述的MultiChildAdornerBehavior
的可重用性。 希望你们中的一些人会喜欢它。
假设知识
假设您已经了解C#,并且对WPF和XAML有基本的了解。 了解WPF程序的一些基本原则将有所帮助。
背景
最近,由于某种原因,我被要求开发一个小型的绘图程序。 由于我刚开始学习WPF,我决定尝试一下。 在绘图程序中,需要在运行时拖动和调整UI元素的大小。 我搜索了这个网站,发现Ashley的文章符合我的需求,但仍然需要扩展,主要是因为它的装饰器仅适用于Framework Element子元素,并且如果您只在一个大的装饰器内容中包含多个装饰器部分,则不容易精确定位。 此外,一些其他小方面也可以按照我的方式进行改进。
Using the Code
假设我们要用4个装饰器子元素装饰一个矩形,每个装饰器子元素位于每一侧,并且AdornerPlacement
设置为不同的值,如上图中的第二行所示。 首先,我们只需在XAML中定义一个基本的普通Rectangle
,如下所示
<Rectangle Stroke="Blue" Fill="Transparent"
Width="50"
Height="50"/>
由于需要将装饰器添加到这个简单的Rectangle
,我们只需使用AttachedProperty
添加一行。 它变成
<Rectangle Stroke="Blue"
pc:MultiChildAdornerBehavior.IsAdornerVisible="True"
Fill="Transparent"
Width="50"
Height="50">
装饰器子元素在哪里? 只需添加另一个AttachedProperty
,一个不太小的AttachedProperty
<Rectangle Stroke="Blue"
pc:MultiChildAdornerBehavior.IsAdornerVisible="True"
Fill="Transparent"
Width="50"
Height="50">
<pc:MultiChildAdornerBehavior.AdornerChildren>
<x:Array Type="FrameworkElement">
<Ellipse
Width="15"
Height="15"
Stroke="Green"
HorizontalAlignment="Left"
pc:MultiChildAdornerBehavior.HorizontalPlacement="Inside"/>
<Ellipse
Width="15"
Height="15"
Stroke="Red"
HorizontalAlignment="Right"/>
<Ellipse
Width="15"
Height="15"
Stroke="Brown"
VerticalAlignment="Top"/>
<Ellipse
Width="15"
Height="15"
Fill="Brown"
VerticalAlignment="Bottom"
pc:MultiChildAdornerBehavior.VerticalPlacement="Outside"/>
</x:Array>
</pc:MultiChildAdornerBehavior.AdornerChildren>
</Rectangle>
请注意,我们还使用某种附加属性来定义装饰器子元素。 在Ashley的解决方案中,此属性设置在被装饰的内容上,这意味着它只能有一个值,尽管多个装饰器部分以某种方式保持在一起。 如果我想在我的简单任务中采用它,那不是太令人满意。
这就是全部。 结果效果正是我想要的。 当每个Adorner子元素添加到FrameworkElementMultiChildAdorner
并由FrameworkElementMultiChildAdorner
排列时,它们会被单独处理。 代码很简单且不言自明,我仍然太懒了。
实际上,我太懒了,以至于我减少了Ashley解决方案的很多内容。 添加到AdornerContent
实现中的那些动画对我来说太多了。
我希望我的微小工作不会让您失望!
关注点
无,无,无
历史
- 2010年11月1日:首次发布