代码之家  ›  专栏  ›  技术社区  ›  PBelanger

WPF的扩展器提供程序

  •  3
  • PBelanger  · 技术社区  · 16 年前

    是否有等效的 System.ComponentModel.IExtenderProvider

    2 回复  |  直到 16 年前
        2
  •  0
  •   Glenn Slayden    6 年前

    可扩展应用程序标记语言 System.ComponentModel.Container . 可扩展应用程序标记语言 XamlType 类型,包括 , XamlProperties .NET 类型系统(即“反射”)。 可扩展应用程序标记语言

    虽然其中一些与 System.ComponentModel

    XamlSchemaContext GetXamlType XamlType

    XamlType LookupAttachableMember LookupAllAttachableMembers XamlType XamlType.LookupInvoker(...) CreateInstance(...)

    XamlTypeInvoker.CreateInstance 可以完全替换一些或所有XAML解析的CLR类型,但这开始违背更大的目的,因为任何这样的“替换”CLR类型——就像由实例化的所有CLR类型一样 --但你当然可以通过这个覆盖来添加!--是使用反射 TypeBuilder Type

    这意味着没有办法得到 XamlType Xaml会员

    可扩展应用程序标记语言 类型系统下的派生 可扩展应用程序标记语言 .

    可扩展应用程序标记语言 XamlXmlReader (对于所谓的“加载路径”场景;我在这里不会讨论“保存路径”)。然而,更重要的是,您也可以重写这两个类,它们提供了一组丰富的虚拟方法来重写。作为伪代码示例(摘自我的工作代码),您可以添加 transform(...) 方法到你的 XamlXmlReader object

    // ...in your class derived from 'XamlXmlReader'
    public void transform(my_xaml_obj_writer xow)
    {
        while (base.Read())
        {
            if (xow.ShouldProvideLineInfo)
                xow.SetLineInfo(LineNumber, LinePosition);
    
            switch (NodeType)
            {
                case XamlNodeType.NamespaceDeclaration:
                    xow.WriteNamespace(base.Namespace);
                    break;
    
                case XamlNodeType.StartObject:
                    xow.WriteStartObject(base.Type);
                    break;
    
                case XamlNodeType.EndObject:
                    xow.inject_ctor_arg();    // <--- !! (not shown)
                    xow.WriteEndObject();
                    break;
    
                case XamlNodeType.StartMember:
                    xow.inject_ctor_arg();    // <--- !! (not shown)
                    xow.WriteStartMember(base.Member);
                    break;
    
                case XamlNodeType.EndMember:
                    xow.WriteEndMember();
                    break;
    
                case XamlNodeType.GetObject:
                    xow.WriteGetObject();
                    break;
    
                case XamlNodeType.Value:
                    xow.WriteValue(base.Value);
                    break;
    
                case XamlNodeType.None:
                    break;
            }
        }
    }
    

    可扩展应用程序标记语言 对内存中的CLR对象执行以下操作:

    void XamlToObject(FileStream fs, my_xaml_schema_context ctx)
    {
        using (var xxr = new xaml_xml_reader(fs, ctx))
        using (var xow = new my_obj_writer(this))
        {
            try
            {
                xxr.transform(xow);
            }
            catch (XamlObjectWriterException xex)
            {
                // ...
            }
        }
    }
    

    Result XamlObjectWriter 在这个过程结束时。在我的例子中,我实际上是在XAML节点流的早期阶段窥探结果对象 transform [UsableDuringInitialization]

    XamlXmlReader设置