65.9K
CodeProject 正在变化。 阅读更多。
Home

用于在 XAML 中定义装饰器的可重用附加行为

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.29/5 (5投票s)

2010 年 11 月 1 日

CPOL

3分钟阅读

viewsIcon

32116

downloadIcon

890

解释如何实现和使用这个强大的行为

引言

本文介绍了一种附加行为技术,我刚用它在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日:首次发布
© . All rights reserved.