【问题标题】:Is derived type also becomes owner for dependency property defined in base class (in WPF/XAML)派生类型也成为基类中定义的依赖属性的所有者(在 WPF/XAML 中)
【发布时间】:2013-05-24 04:02:33
【问题描述】:

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

<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>

注意TargetTypeRectangleStoryboard.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 都成为了依赖属性的所有者。

【问题讨论】:

  • 有趣!!!!。很想知道原因。

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


【解决方案1】:

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

因为Rectangle也继承自FrameworkElement,所以动画Canvas.WidthProperty与动画Rectangle.WidthProperty相同,与动画FrameworkElement.WidthProperty相同。

【讨论】:

  • 不确定是否真的那么简单。首先,它不是一个名为WidthProperty 的静态属性,而是一个静态只读字段。其次,我可以成功地为 DependencyProperty 字段不符合 &lt;name&gt;Property 命名约定的属性(通过在 XAML 中定义的情节提要,如问题中所述)设置动画。
  • @Clemens:谢谢,纠正了错字。如果找不到静态字段,我相信 XAML 编译器会回退到尝试解析属性。如果您设法在没有支持字段的情况下通过不在被动画对象的类型层次结构中的类型为属性设置动画,那么我会感到惊讶。
【解决方案2】:

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

Storyboard.TargetProperty="(FrameworkElement.Width)"

但我最喜欢的是:

Storyboard.TargetProperty="(DataGrid.Width)"

试试看。它会起作用的!

【讨论】:

  • 它正在工作。我想明白为什么?由于继承或依赖财产所有权。没有找到任何关于此问题的可靠 MSDN 参考
  • 真的很简单。 Width 属性存在于由FrameworkElement 继承的每个类上。您没有绑定到 Rectangle 的实际 Width 属性。框架搜索正确的属性。请不要忘记将问题标记为已回答:)
  • 我想了解依赖属性在继承中是如何工作的。 FrameworkPropertyMetadata.InheritsDependencyProperty.AddOwner 方法等。请注意,依赖属性声明为静态只读,CLR 实例属性作为包装器。
  • 在 WPF 中,一切都是关于 Dependency PropertiesFrameworkElement 有一个名为 WidthProperty 的属性。此属性可以设置动画。当您在情节提要中引用 Width 属性时,使用 CanvasDataGridFramwork... 都没有关系,它们都引用同一个 DependencyProperty
猜你喜欢
  • 2012-05-19
  • 1970-01-01
  • 1970-01-01
  • 2012-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多