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

本文关键字:所有者 WPF XAML 属性 依赖 基类 类型 派生 定义 | 更新日期: 2023-09-27 18:15:43

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

<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属性。

我明白在故事板。TargetProperty(或XAML中的其他任何地方),我们必须使用PropertyPath语法,就像(ownerType.PropertyName)

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

  1. 是因为Canvas。宽度、矩形。Width或FrameworkElement。Width全部指向FrameowrkElement。因为Width是在FrameworkElement中定义的,而Canvas/Rectangle是由它派生的。
  2. 还是因为,通过继承,Canvas和Rectangle都成为了依赖属性的所有者?

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

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

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

由于Width PropertyFrameworkElement类的Property,您可以输入从FrameworkElement继承的每个Control

Storyboard.TargetProperty="(FrameworkElement.Width)"

但我最喜欢的是:

Storyboard.TargetProperty="(DataGrid.Width)"

试试。会成功的!