Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF中PropertyMetaData、UIPropertyMetadata和FrameworkMetaData之间有什么区别_Wpf - Fatal编程技术网

WPF中PropertyMetaData、UIPropertyMetadata和FrameworkMetaData之间有什么区别

WPF中PropertyMetaData、UIPropertyMetadata和FrameworkMetaData之间有什么区别,wpf,Wpf,我知道这些类之间的基本区别,即在备份属性时使用PropertyMetadata,在希望支持动画时使用UIPropertyMetadata,以及在用户控件中使用框架属性的框架元数据 但我只懂理论部分。 这将是一个伟大的hep,如果你能解释一个最简单的例子,在3个不同的依赖属性中使用所有这3个类来清楚地区分它们 提前感谢。PropertyMetadata和FrameworkPropertyMetadata之间的一个重要实际区别是后者允许指定一组属性 例如,指定FrameworkPropertyMet

我知道这些类之间的基本区别,即在备份属性时使用PropertyMetadata,在希望支持动画时使用UIPropertyMetadata,以及在用户控件中使用框架属性的框架元数据

但我只懂理论部分。 这将是一个伟大的hep,如果你能解释一个最简单的例子,在3个不同的依赖属性中使用所有这3个类来清楚地区分它们


提前感谢。

PropertyMetadata和FrameworkPropertyMetadata之间的一个重要实际区别是后者允许指定一组属性

例如,指定
FrameworkPropertyMetadataOptions.AffectsRender
会关心启动属性已更改的UIElement的重新呈现。如果没有此标志,则必须在PropertyChangedCallback中手动执行此操作。

来源:

当您和您通过调用
DependencyProperty.register
注册属性时,您可以通过向属性传递
PropertyMetadata
的实例来为属性指定一些元数据。这可以是
PropertyMetadata
类的实例,也可以是其子类之一的实例。差异如下所示

属性元数据
–与依赖项属性相关的基本元数据

  • 强制值回调
    –设置值时强制值
  • DefaultValue
    –属性的默认值
  • PropertyChangedCallback
    –响应属性的新有效值
UIPropertyMetadata
–源自
PropertyMetadata
,并添加:

  • isanimationProbited
    –是否禁用此属性的动画
FrameworkPropertyMetadata
–源自
UIPropertyMetadata
,并添加:

  • AffectsArrange
    AffectsMeasure
    affectsparentrange
    AffectsParentMeasure
    AffectsRender
    ——属性值更改后是否应重新运行布局计算
  • BindsTwoWayByDefault
    DefaultUpdateSourceTrigger
    IsDataBindingAllowed
    IsNotDataBindable
    –指定属性如何参与数据绑定
  • 继承
    重写继承行为
    –继承是否适用于此属性
  • 日志
    –记录日志时是否存储此值
  • 子属性DonoEffectRender
    –在布局更改时检查此对象的属性

FrameworkPropertyMetadata
UIPropertyMetadata
公开的所有行为都由记录在单个
enum
(32位
uint
字段中的标记位控制,该字段被称为
\u flags
,在
PropertyMetadata
基类中声明,即使没有一个旗帜是从那里公开的。以下是该枚举的声明:

internal enum MetadataFlags : uint { DefaultValueModifiedID /**/= 0b_00000000_00000000_00000000_00000001, //0x00000001 SealedID /**/= 0b_00000000_00000000_00000000_00000010, //0x00000002 Inherited /**/= 0b_00000000_00000000_00000000_00010000, //0x00000010 UI_IsAnimationProhibitedID /**/= 0b_00000000_00000000_00000000_00100000, //0x00000020 FW_AffectsMeasureID /**/= 0b_00000000_00000000_00000000_01000000, //0x00000040 FW_AffectsArrangeID /**/= 0b_00000000_00000000_00000000_10000000, //0x00000080 FW_AffectsParentMeasureID /**/= 0b_00000000_00000000_00000001_00000000, //0x00000100 FW_AffectsParentArrangeID /**/= 0b_00000000_00000000_00000010_00000000, //0x00000200 FW_AffectsRenderID /**/= 0b_00000000_00000000_00000100_00000000, //0x00000400 FW_OverridesInheritanceBehaviorID /**/= 0b_00000000_00000000_00001000_00000000, //0x00000800 FW_IsNotDataBindableID /**/= 0b_00000000_00000000_00010000_00000000, //0x00001000 FW_BindsTwoWayByDefaultID /**/= 0b_00000000_00000000_00100000_00000000, //0x00002000 FW_ShouldBeJournaledID /**/= 0b_00000000_00000000_01000000_00000000, //0x00004000 FW_SubPropertiesDoNotAffectRenderID /**/= 0b_00000000_00000000_10000000_00000000, //0x00008000 FW_SubPropertiesDoNotAffectRenderModifiedID= 0b_00000000_00000001_00000000_00000000, //0x00010000 FW_InheritsModifiedID /**/= 0b_00000000_00010000_00000000_00000000, //0x00100000 FW_OverridesInheritanceBehaviorModifiedID = 0b_00000000_00100000_00000000_00000000, //0x00200000 FW_ShouldBeJournaledModifiedID /**/= 0b_00000001_00000000_00000000_00000000, //0x01000000 FW_UpdatesSourceOnLostFocusByDefaultID /**/= 0b_00000010_00000000_00000000_00000000, //0x02000000 FW_DefaultUpdateSourceTriggerModifiedID/**/= 0b_00000100_00000000_00000000_00000000, //0x04000000 FW_ReadOnlyID /**/= 0b_00001000_00000000_00000000_00000000, //0x08000000 FW_DefaultUpdateSourceTriggerEnumBit1 /**/= 0b_01000000_00000000_00000000_00000000, //0x40000000 FW_DefaultUpdateSourceTriggerEnumBit2 /**/= 0b_10000000_00000000_00000000_00000000, //0x80000000 };

[编辑:警报/警告:由于某些未知原因,上面显示的标志不与相应的
FrameworkPropertyMetadataOptions
标志指定的值共享相同的值

[Flags]
public enum FrameworkPropertyMetadataOptions
{                                  //         FPMO            MetadataFlags
                                   //     ----------           ----------
                                   //                          0x00000010 ←┐
    None                           /**/ = 0x00000000, //                   │
    AffectsMeasure                 /**/ = 0x00000001, //  << 6 0x00000040  │
    AffectsArrange                 /**/ = 0x00000002, //  << 6 0x00000080  │
    AffectsParentMeasure           /**/ = 0x00000004, //  << 6 0x00000100  │
    AffectsParentArrange           /**/ = 0x00000008, //  << 6 0x00000200  │
    AffectsRender                  /**/ = 0x00000010, //  << 6 0x00000400  │
    Inherits                       /**/ = 0x00000020, //  >> 1   →  →  ────┘
    OverridesInheritanceBehavior   /**/ = 0x00000040, //  << 5 0x00000800
    NotDataBindable                /**/ = 0x00000080, //  << 5 0x00001000
    BindsTwoWayByDefault           /**/ = 0x00000100, //  << 5 0x00002000
    Journal                        /**/ = 0x00000400, //  << 4 0x00004000
    SubPropertiesDoNotAffectRender /**/ = 0x00000800, //  << 4 0x00008000
};
[标志]
公共枚举框架属性元数据选项
{//FPMO元数据标志
//     ----------           ----------
//0x00000010←┐
无/**/=0x00000000,//│

AffectsMeasure/**/=0x00000001,//您可以自己轻松创建3个依赖项属性并观察结果。然后,如果您仍然有特定问题,请过来问一个问题。我刚刚开始使用依赖项属性。但是为了熟悉所有这3个类,如果您编写解释一下,这对我很有帮助。谢谢。
[Flags]
public enum FrameworkPropertyMetadataOptions
{                                  //         FPMO            MetadataFlags
                                   //     ----------           ----------
                                   //                          0x00000010 ←┐
    None                           /**/ = 0x00000000, //                   │
    AffectsMeasure                 /**/ = 0x00000001, //  << 6 0x00000040  │
    AffectsArrange                 /**/ = 0x00000002, //  << 6 0x00000080  │
    AffectsParentMeasure           /**/ = 0x00000004, //  << 6 0x00000100  │
    AffectsParentArrange           /**/ = 0x00000008, //  << 6 0x00000200  │
    AffectsRender                  /**/ = 0x00000010, //  << 6 0x00000400  │
    Inherits                       /**/ = 0x00000020, //  >> 1   →  →  ────┘
    OverridesInheritanceBehavior   /**/ = 0x00000040, //  << 5 0x00000800
    NotDataBindable                /**/ = 0x00000080, //  << 5 0x00001000
    BindsTwoWayByDefault           /**/ = 0x00000100, //  << 5 0x00002000
    Journal                        /**/ = 0x00000400, //  << 4 0x00004000
    SubPropertiesDoNotAffectRender /**/ = 0x00000800, //  << 4 0x00008000
};