派生类型也成为基类中定义的依赖项属性的所有者(在WPF / XAML中)

时间:2013-05-29 02:43:28

标签: c# .net wpf xaml dependency-properties

在其中一个模块中,我看到了以下样式设置。

<Style TargetType="Rectangle">
            <Style.Triggers>
                <EventTrigger RoutedEvent="MouseEnter">
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation To="300" Duration="0:0:1.5" 
                    AccelerationRatio="0.10" DecelerationRatio="0.25" 
                    Storyboard.TargetProperty="(Canvas.Width)" />
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </Style.Triggers>
        </Style>

请注意,TargetTypeRectangle,而Storyboard.TargetPropertyCanvas.Width。 样式/触发器仍然正常工作。它为Rectangle.width属性设置了动画。

我理解在Storyboard.TargetProperty(或XAML中的任何其他位置),我们必须使用PropertyPath syntax,就像(ownerType.PropertyName)

我的问题是如何在Canvas.Width上设置动画动画Rectangle.Width

  1. 是因为Canvas.Width,Rectangle.Width或FrameworkElement.Width都指向FrameowrkElement.Width属性,因为Width是在FrameworkElement中定义的,而Canvas / Rectangle是从它派生的。
  2. 或者是因为继承,Canvas和Rectangle都成为依赖属性的所有者。

2 个答案:

答案 0 :(得分:1)

这是因为XAML编译器通过在Canvas.Width上查找名为WidthProperty的静态字段来解析Canvas。由于Canvas继承自FrameworkElement,因此对Canvas.WidthProperty的引用会解析为FrameworkElement.WidthProperty

由于Rectangle也继承自FrameworkElement,动画Canvas.WidthProperty与动画Rectangle.WidthProperty相同,与动画FrameworkElement.WidthProperty相同。

答案 1 :(得分:0)

由于Width PropertyProperty班级的FrameworkElement,您可以输入继承自Control

的每FrameworkElementStoryboard.TargetProperty="(FrameworkElement.Width)"
Storyboard.TargetProperty="(DataGrid.Width)"

但我最喜欢的是:

{{1}}

试试吧。它会工作!