5

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

<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 语法,就像(ownerType.PropertyName).

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

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

2 回答 2

1

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

因为Rectangle也继承自FrameworkElement,动画Canvas.WidthProperty同动画Rectangle.WidthProperty,同动画FrameworkElement.WidthProperty

于 2013-05-29T09:06:02.280 回答
0

由于Width Property是类的一个PropertyFrameworkElement你可以输入Control继承自的每一个FrameworkElement

Storyboard.TargetProperty="(FrameworkElement.Width)"

但我最喜欢的是:

Storyboard.TargetProperty="(DataGrid.Width)"

试试看。它会起作用的!

于 2013-05-29T12:18:39.890 回答