gpt4 book ai didi

c# - 您可以/如何在运行时为 PropertyGrid(对于 PCL)指定编辑器?

转载 作者:太空宇宙 更新时间:2023-11-03 22:54:24 25 4
gpt4 key购买 nike

我在其中编写了一个带有自定义对象的 PCL,然后我创建了一个 GUI 来处理来自 PCL 的对象...我尝试使用 PropertyGrid 来编辑属性...我已经按顺序阅读了该内容为了让网格知道如何处理对象,我需要指定 EditorAttribute 以及提供 TypeConverter...但我认为我无法在 PCL 中添加这两个...

有没有办法在 GUI 级别处理这个问题,比如告诉 PropertyGrid 在运行时使用特定类型的编辑器/TypeConverter?我查看了网格的可用功能/属性列表,但看起来不太可能。

最佳答案

您可以创建一个包含与原始类相同属性的元数据类,并使用某些属性修饰元数据类的属性。然后告诉类型描述符使用元数据类为您的原始类提供类型描述:

var provider = new AssociatedMetadataTypeTypeDescriptionProvider(
typeof(MyClass),
typeof(MyClassMetadata));
TypeDescriptor.AddProvider(provider, typeof(MyPortableClass));

PropertyGrid 控件使用您的类的类型描述符来显示您的类的属性、它们的显示名称、它们的描述、它们的编辑器等等。您可以用不同的方式分配类型描述符。

在您的情况下,最好的解决方案是在运行时为您的类注册一个新的 TypeDescriptorProvider。这样您就可以在运行时更改 PropertyGrid 类的外观。

使用 AssociatedMetadataTypeTypeDescriptionProvider您可以为您的类创建一个类型描述符提供程序,它使用元数据类来提供类型描述。然后您可以使用 TypeDescriptor.AddProvider 注册提供者.

这样您就可以为您的类引入一个元数据类,其中包含属性的属性。

分步示例

  1. 向解决方案中添加一个可移植类库并向其中添加一个类:

    public class MyClass
    {
    public string Property1 { get; set; }
    public string Property2 { get; set; }
    }
  2. 将可移植类库的引用添加到您的 Windows 窗体项目。只要确保目标框架一致即可。

  3. System.DesignSystem.ComponentModel.DataAnnotations 引用添加到您的 Windows 窗体项目。

  4. 在 Windows 窗体项目中,为您的可移植类添加一个元数据类。该类应包含与原始类完全相同的属性:

    public class MyClassMetadata
    {
    [Category("My Properties")]
    [DisplayName("First Property")]
    [Description("This is the first Property.")]
    public string Property1 { get; set; }

    [Category("My Properties")]
    [DisplayName("Second Property")]
    [Description("This is the second Property.")]
    [Editor(typeof(MultilineStringEditor), typeof(UITypeEditor))]
    public string Property2 { get; set; }
    }

    您需要添加这些用法:

    using System.ComponentModel;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.Design;
    using System.Drawing.Design;
  5. 在表单的 Load 事件中,以这种方式为您的类型注册元数据提供程序:

    var provider = new AssociatedMetadataTypeTypeDescriptionProvider(
    typeof(MyClass),
    typeof(MyClassMetadata));
    TypeDescriptor.AddProvider(provider, typeof(MyClass));
  6. 在属性网格中显示可移植类的实例:

    var myObject = new MyClass();
    this.propertyGrid1.SelectedObject = myObject ;

这是运行应用程序后的结果:

enter image description here

关于c# - 您可以/如何在运行时为 PropertyGrid(对于 PCL)指定编辑器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46099675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com