探索PropertyGrid的使用

C#控件PropertyGrid使用 二、创建一个类并新增需要的属性和字段,用于添加到propertyGrid控件上显示,并用XML序列化和反序列化,保存在本地和读取显示。四、用反射设定propertyGrid控件第1列(属性名称)的列宽,说明窗口高度,属性显示或隐藏。三、用特性设定类中属性和字段,在propertyGrid控件上的:名称、显示、分组、描述。一、创建winform并在界面添加propertyGrid控件。 阅读详情

 

本文旨在帮助了解 microsoft .net 框架中的 propertygrid 控件,以及如何针对的应用程序自定义该控件。

propertygrid 控件简介

如果您使用过 microsoft® visual basic® 或 microsoft visual studio .net,那么您一定使用过属性浏览器来浏览、查看和编辑一个或多个对象的属性。.net 框架 propertygrid 控件是 visual studio .net 属性浏览器的核心。propertygrid 控件显示对象或类型的属性,并主要通过使用反射来检索项目的属性。(反射是在运行时提供类型信息的技术。)下面的屏幕快照显示了 propertygrid 在窗体上的外观。

图 1:窗体上的 propertygrid

propertygrid 包含以下部分:

  • 属性
  • 可展开属性
  • 属性类别标题
  • 属性说明
  • 属性编辑器
  • 属性选项卡
  • 命令窗格(显示控件设计器提供的设计器操作)

创建 propertygrid 控件

要使用 visual studio .net 创建 propertygrid 控件,需要将该控件添加到工具箱中,因为默认情况下并不包含该控件。在 tools(工具)菜单中,选择 customize toolbox(自定义工具箱)。在对话框中选择 framework components(框架组件)选项卡,然后选择 propertygrid。

如果您从命令行编译代码,请使用 /reference 选项并指定 system.windows.forms.dll。

以下代码显示了如何创建 propertygrid 控件并将其添加到窗体中。

using system;
using system.drawing;
using system.componentmodel;
using system.windows.forms;
using system.globalization;

public class optionsdialog : system.windows.forms.form
{
   private system.windows.forms.propertygrid optionspropertygrid;
   public optionsdialog()
   {
      optionspropertygrid = new propertygrid();
      optionspropertygrid.size = new size(300, 250);

      this.controls.add(optionspropertygrid);
      this.text = "选项对话框";
   }

   [stathread]
   static void main()
   {
      application.run(new optionsdialog());
   }
}

何处使用 propertygrid 控件

在应用程序中的很多地方,您都可以使用户与 propertygrid 进行交互,从而获得更丰富的编辑体验。例如,某个应用程序包含多个用户可以设置的“设置”或选项,其中一些可能十分复杂。您可以使用单选按钮、组合框或文本框来表示这些选项。但本文将逐步介绍如何使用 propertygrid 控件创建选项窗口来设置应用程序选项。上面所创建的 optionsdialog 窗体即是选项窗口的开始。现在,我们创建一个名为 appsettings 的类,其中包含映射到应用程序设置的所有属性。如果创建单独的类而不使用多个分散的变量,设置将更便于管理和维护。

public class appsettings{
    private bool saveonclose = true;
    private string greetingtext = "欢迎使用应用程序!";
    private int itemsinmru = 4;
    private int maxrepeatrate = 10;
    private bool settingschanged = false;
    private string appversion = "1.0";
   
    public bool saveonclose
    {
        get { return saveonclose; }
        set { saveonclose = value;}
    }
    public string greetingtext
    {
        get { return greetingtext; }
        set { greetingtext = value; }
    }
    public int maxrepeatrate
    {
        get { return maxrepeatrate; }
        set { maxrepeatrate = value; }
    }
    public int itemsinmrulist
    {
        get { return itemsinmru; }
        set { itemsinmru = value; }
    }
    public bool settingschanged
    {
        get { return settingschanged; }
        set { settingschanged = value; }
    }
    public string appversion
    {
        get { return appversion; }
        set { appversion = value; }
    }
}

选项窗口上的 propertygrid 将使用此类,因此请将类定义添加到应用程序项目中,在添加时可创建新文件或将其添加到现有窗体源代码的下方。

选择对象

要标识 propertygrid 显示的内容,请将 propertygrid.selectedobject 属性设置为一个对象实例。然后,propertygrid 将完成其余的工作。每次设置 selectedobject 时,propertygrid 都会刷新显示的属性。这提供了一种简单的方法来强制刷新属性,或在运行时切换对象。您还可以调用 propertygrid.refresh 方法来刷新属性。

接下来,您需要更新 optionsdialog 构造函数中的代码,以创建一个 appsettings 对象,并将其设置为 propertygrid.selectedobject 属性的值。

public optionsdialog()
   {
      optionspropertygrid = new propertygrid();
      optionspropertygrid.size = new size(300, 250);

      this.controls.add(optionspropertygrid);
      this.text = "选项对话框";

      // 创建 appsettings 类并在 propertygrid 中显示该类。
      appsettings appset = new appsettings();
      optionspropertygrid.selectedobject = appset;
   }

编译并运行该应用程序。下面的屏幕快照显示了应用程序的外观。

图 2:propertygrid 中选定的 appsettings 类

自定义 propertygrid 控件

您可以修改 propertygrid 的某些外观特征以满足自己的需要。可以更改某些属性的显示方式,甚至选择不显示某些属性。那么,如何对 propertygrid 进行自定义呢?

 

更改 propertygrid 的外观特征

propertygrid 的许多外观特征都可以自定义。下面列出了其中的一部分:

  • 通过 helpbackcolor、helpforecolor 和 helpvisible 属性可以更改背景颜色、更改字体颜色或隐藏说明窗格。
  • 通过 toolbarvisible 属性可以隐藏工具栏,通过 backcolor 属性可以更改工具栏的颜色,通过 largebuttons 属性可以显示大工具栏按钮。
  • 使用 propertysort 属性可以按字母顺序对属性进行排序和分类。
  • 通过 backcolor 属性可以更改拆分器的颜色。
  • 通过 linecolor 属性可以更改网格线和边框。

本示例中的选项窗口不需要工具栏,因此可以将 toolbarvisible 设置为 false。其余属性均保留默认设置。

更改属性的显示方式

要更改某些属性的显示方式,您可以对这些属性应用不同的特性。特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了其中的一部分:

  • descriptionattribute - 设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。可以将此特性应用于 maxrepeatrate 属性。
  • categoryattribute - 设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给杂项类别。可以将此特性应用于所有属性。
  • browsableattribute – 表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。可以将此特性应用于 settingschanged 属性。
  • readonlyattribute – 表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有 get 和 set 访问函数的公共属性在网格中是可以编辑的。可以将此特性应用于 appversion 属性。
  • defaultvalueattribute – 表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
  • defaultpropertyattribute – 表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。可以将此特性应用于 appsettings 类。

现在,我们将其中的一些特性应用于 appsettings 类,以更改属性在 propertygrid 中的显示方式。

[defaultpropertyattribute("saveonclose")]
public class appsettings{
    private bool saveonclose = true;
    private string greetingtext = "欢迎使用应用程序!";
    private int maxrepeatrate = 10;
    private int itemsinmru = 4;

    private bool settingschanged = false;
    private string appversion = "1.0";

    [categoryattribute("文档设置"),
    defaultvalueattribute(true)]
    public bool saveonclose
    {
        get { return saveonclose; }
        set { saveonclose =

value;} } [categoryattribute("全局设置"), readonlyattribute(true), defaultvalueattribute("欢迎使用应用程序!")] public string greetingtext { get { return greetingtext; } set { greetingtext = value; } } [categoryattribute("全局设置"), defaultvalueattribute(4)] public int itemsinmrulist { get { return itemsinmru; } set { itemsinmru = value; } } [descriptionattribute("以毫秒表示的文本重复率。"), categoryattribute("全局设置"), defaultvalueattribute(10)] public int maxrepeatrate { get { return maxrepeatrate; } set { maxrepeatrate = value; } } [browsableattribute(false), defaultvalueattribute(false)] public bool settingschanged { get { return settingschanged; } set { settingschanged = value; } } [categoryattribute("版本"), defaultvalueattribute("1.0"), readonlyattribute(true)] public string appversion { get { return appversion; } set { appversion = value; } } }


将这些特性应用于 appsettings 类后,编译并运行该应用程序。下面的屏幕快照显示了应用程序的外观。



图 3:propertygrid 中显示的带有类别和默认值的属性


使用此版本的选项窗口后,您会注意到以下几点:   

  • 显示窗口时,将首先突出显示 saveonclose 属性。
       
  • 选中 maxrepeatrate 属性时,说明帮助窗格中将显示“以毫秒表示的文本重复率”。
       
  • saveonclose 属性显示在“文档设置”类别下。其他属性分别显示在“全局设置”和“版本”类别下。
       
  • settingschanged 属性将不再显示。
       
  • appversion 属性为只读。只读属性以灰显文本显示。
       
  • 如果 saveonclose 属性包含的值不是 true,该值将以粗体显示。propertygrid 使用粗体文本表示包含非默认值的属性。

显示复杂属性


到现在为止,选项窗口显示的都是简单的类型,如整数、布尔值和字符串。那么,如何显示更复杂的类型呢?如果应用程序需要跟踪窗口大小、文档字体或工具栏颜色等信息,该如何处理呢?.net 框架提供的某些数据类型具有特殊的显示功能,能使这些类型在 propertygrid 中更具可用性。


对所提供类型的支持


首先,请更新 appsettings 类,为窗口大小(size 类型)、窗口字体(font 类型)和工具栏颜色(color 类型)添加新属性

[defaultpropertyattribute("saveonclose")]
public class appsettings{
    private bool saveonclose = true;
    private string greetingtext = "欢迎使用应用程序!";
    private int maxrepeatrate = 10;
    private int itemsinmru = 4;

    private bool settingschanged = false;
    private string appversion = "1.0";
   
    private size windowsize = new size(100,100);
    private font windowfont = new font("宋体", 9, fontstyle.regular);
    private color toolbarcolor = systemcolors.control;

    [categoryattribute("文档设置"),
    defaultvalueattribute(true)]
    public bool saveonclose
    {
        get { return saveonclose; }
        set { saveonclose = value;}
    }

    [categoryattribute("文档设置")]

cfe> public size windowsize { get { return windowsize; } set { windowsize = value;} } [categoryattribute("文档设置")] public font windowfont { get {return windowfont; } set { windowfont = value;} } [categoryattribute("全局设置")] public color toolbarcolor { get { return toolbarcolor; } set { toolbarcolor = value; } } [categoryattribute("全局设置"), readonlyattribute(true), defaultvalueattribute("欢迎使用应用程序!")] public string greetingtext { get { return greetingtext; } set { greetingtext = value; } } [categoryattribute("全局设置"), defaultvalueattribute(4)] public int itemsinmrulist { get { return itemsinmru; } set { itemsinmru = value; } } [descriptionattribute("以毫秒表示的文本重复率。"), categoryattribute("全局设置"), defaultvalueattribute(10)] public int maxrepeatrate { get { return maxrepeatrate; } set { maxrepeatrate = value; } } [browsableattribute(false), defaultvalueattribute(false)] public bool settingschanged { get { return settingschanged; } set { settingschanged = value; } } [categoryattribute("版本"), defaultvalueattribute("1.0"), readonlyattribute(true)] public string appversion { get { return appversion; } set { appversion = value; } } }

 

下面的屏幕快照显示了新属性在 propertygrid 中的外观。

图 4:显示在 propertygrid 中的 .net 框架数据类型

请注意,windowfont 属性带有一个省略号 (...) 按钮,按下该按钮将显示字体选择对话框。此外,还可以展开该属性以显示更多的 font 属性。某些 font 属性提供有关字体的值和详细信息的下拉列表。您可以展开 windowsize 属性以显示 size 类型的更多属性。最后,请注意,toolbarcolor 属性包含一个选定颜色的样本,以及一个用于选择不同颜色的自定义下拉列表。对于这些以及其他数据类型,.net 框架提供了其他的类,可以使在 propertygrid 中的编辑更加容易。

对自定义类型的支持

现在,您需要在 appsettings 类中添加另外两个属性,即 defaultfilename 和 spellcheckoptions。 defaultfilename 属性用于获取或设置字符串;spellcheckoptions 属性用于获取或设置 spellingoptions 类的实例。

spellingoptions 类是一个新类,用于管理应用程序的拼写检查属性。对于何时创建单独的类以管理对象的属性,并没有严格的规定,而取决于您的整个类设计。将 spellingoptions 类定义添加到应用程序项目中 - 可以添加到新文件中,也可以添加到窗体源代码的下方。

 

提供可展开对象支持

1.创建一个从 expandableobjectconverter 继承而来的类。

public class spellingoptionsconverter:expandableobjectconverter {  }

2.如果 destinationtype 参数与使用此类型转换器的类(示例中的 spellingoptions 类)的类型相同,则覆盖 canconvertto 方法并返回 true;否则返回基类 canconvertto 方法的值。

public override bool canconvertto(itypedescriptorcontext context,system.type destinationtype)
{
    if (destinationtype == typeof(spellingoptions))
        return true;
    return base.canconvertto(context, destinationtype);
}

3.覆盖 convertto 方法,并确保 destinationtype 参数是一个 string,并且值的类型与使用此类型转换器的类(示例中的 spellingoptions 类)相同。如果其中任一情况为 false,都将返回基类 convertto 方法的值;否则,返回值对象的字符串表示。字符串表示需要使用唯一分隔符将类的每个属性隔开。由于整个字符串都将显示在 propertygrid 中,因此需要选择一个不会影响可读性的分隔符,逗号的效果通常比较好

public override object convertto(itypedescriptorcontext context,
                               cultureinfo culture,
                               object value,
                               system.type destinationtype)
{
    if (destinationtype == typeof(system.string) &&
         value is spellingoptions){

        spellingoptions so = (spellingoptions)value;

        return "在键入时检查:" + so.spellcheckwhiletyping +
               ",检查大小写: " + so.spellcheckcaps +
               ",建议更正: " + so.suggestcorrections;
    }
    return base.convertto(context, culture, value, destinationtype);
}

4.(可选)通过指定类型转换器可以从字符串进行转换,您可以启用网格中对象字符串表示的编辑。要执行此操作,首先需要覆盖 canconvertfrom 方法并返回 true(如果源 type 参数为 string 类型);否则,返回基类 canconvertfrom 方法的值

public override bool canconvertfrom(itypedescriptorcontext context,
                              system.type sourcetype)
{
    if (sourcetype == typeof(string))
        return true;

    return base.canconvertfrom(context, sourcetype);
}

5.要启用对象基类的编辑,同样需要覆盖 convertfrom 方法并确保值参数是一个 string。如果不是 string,将返回基类 convertfrom 方法的值;否则,返回基于值参数的类(示例中的 spellingoptions 类)的新实例。您需要根据值参数解析类的每个属性的值。了解在 convertto 方法中创建的分隔字符串的格式将有助于您的解析。

public override object convertfrom(itypedescriptorcontext context,
                              cultureinfo culture, object value)
{
    if (value is string) {
        try {
            string s = (string) value;
            int colon = s.indexof(':');
            int comma = s.indexof(',');

            if (colon != -1 && comma != -1) {
                string checkwhiletyping = s.substring(colon + 1 ,
                                                (comma - colon - 1));

                colon = s.indexof(':', comma + 1);
                comma = s.indexof(',', comma + 1);

                string checkcaps = s.substring(colon + 1 ,
                                                (comma - colon -1));

                colon = s.indexof(':', comma + 1);

                string suggcorr = s.substring(colon + 1);

                spellingoptions so = new spellingoptions();

                so.spellcheckwhiletyping =boolean.parse(checkwhiletyping);
                so.spellcheckcaps = boolean.parse(checkcaps);
                so.suggestcorrections = boolean.parse(suggcorr);
                   
                return so;
            }
        }
        catch {
            throw new argumentexception(
                "无法将“" + (string)value +
                                   "”转换为 spellingoptions 类型");
        }
    } 
    return base.convertfrom(context, culture, value);
}

  • 现在已经有了一个类型转换器类,下面您需要确定使用该类的目标类。您可以通过将 typeconverterattribute 应用到目标类(示例中的 spellingoptions 类)来执行此操作。

    // 应用于 spellingoptions 类的 typeconverter 特性。
    [
    typeconverterattribute(typeof(spellingoptionsconverter)),
    descriptionattribute("展开以查看应用程序的拼写选项。")]
    public class spellingoptions{ ... }

    再次编译并运行选项窗口应用程序。下面的屏幕快照显示了选项窗口目前的外观。

    图 6:在 propertygrid 中显示的带有类型转换器的自定义数据类型

    注意: 如果只需要可展开对象支持,而不需要自定义字符串表示,则只需将 typeconverterattribute 应用到类中。将 expandableobjectconverter 指定为类型转换器类型。
    添加域列表和简单的下拉列表属性支持

    对于基于 enum 类型返回枚举的属性,propertygrid 会自动在下拉列表中显示枚举值。enumconverter 也提供了这一功能。对于自己的属性,您可能希望为用户提供一个有效值列表(有时也称为选取列表或域列表),而其类型并不是基于 enum。如果域值在运行时之前未知,或者值可以更改,则属于这种情况。

    修改选项窗口,提供一个用户可从中选择的默认文件名的域列表。您已经将 defaultfilename 属性添加到 appsettings 类。下一步是在 propertygrid 中显示属性的下拉列表,以提供域列表。

    提供简单的下拉列表属性支持
    1. 创建一个从类型转换器类继承而来的类。由于 defaultfilename 属性属于 string 类型,因此可以从 stringconverter 中继承。如果属性类型的类型转换器不存在,则可以从 typeconverter 继承;这里并不需要。

         public class filenameconverter: stringconverter {  }

      2.覆盖 getstandardvaluessupported 方法并返回 true,表示此对象支持可以从列表中选取的一组标准值。

    public override bool getstandardvaluessupported(
                               itypedescriptorcontext context)
    {
        return true;
    }

    3.覆盖 getstandardvalues 方法并返回填充了标准值的 standardvaluescollection。创建 standardvaluescollection 的方法之一是在构造函数中提供一个值数组。对于选项窗口应用程序,您可以使用填充了建议的默认文件名的 string 数组。

    public override standardvaluescollection
                         getstandardvalues(itypedescriptorcontext context)
    {
        return new standardvaluescollection(new string[]{"新文件",
                                                         "文件1",
                                                         "文档1"});
    }

    4.(可选)如果希望用户能够键入下拉列表中没有包含的值,请覆盖 getstandardvaluesexclusive 方法并返回 false。这从根本上将下拉列表样式变成了组合框样式。

    public override bool getstandardvaluesexclusive(
                               itypedescriptorcontext context)
    {
        return false;
    }

    5.拥有自己的用于显示下拉列表的类型转换器类后,您需要确定使用该类的目标。在本示例中,目标为 defaultfilename 属性,因为类型转换器是针对该属性的。将 typeconverterattribute 应用到目标属性中。

    // 应用到 defaultfilename 属性的 typeconverter 特性。
    [
    typeconverter(typeof(filenameconverter)),
    categoryattribute("文档设置")]
    public string defaultfilename
    {
        get{ return defaultfilename; }
        set{ defaultfilename = value; }
    }

    再次编译并运行选项窗口应用程序。下面的屏幕快照显示了选项窗口目前的外观。请注意 defaultfilename 属性的外观。

    图 7:在 propertygrid 中显示下拉域列表

    为属性提供自定义 ui

    如上所述,.net 框架类型使用 typeconverter 和 uitypeeditor 类(以及其他类)来提供 propertygrid 编辑支持。有关如何使用 typeconverter,请参阅对自定义类型的支持一节;您也可以使用 uitypeeditor 类来自定义 propertygrid。

    您可以在 propertygrid 中提供小图形表示和属性值,类似于为 image 和 color 类提供的内容。要在自定义中执行此操作,请从 uitypeeditor 继承,覆盖 getpaintvaluesupported 并返回 true。然后,覆盖 uitypeeditor.paintvalue 方法,并在自己的方法中使用 paintvalueeventargs.graphics 参数绘制图形。最后,将 editor 特性应用到使用 uitypeeditor 类的类或属性。

    下面的屏幕快照显示了结果外观。

    图 8:在 propertygrid 中显示属性的自定义图形

    您也可以提供自己的下拉列表控件,这与 control.dock 属性用来为用户提供靠接选择的控件类似。要执行此操作,请从 uitypeeditor 继承,覆盖 geteditstyle,然后返回一个 uitypeeditoreditstyle 枚举值,例如 dropdown。您的自定义下拉列表控件必须从 control 或 control 的派生类(例如 usercontrol)继承而来。然后,覆盖 uitypeeditor.editvalue 方法。使用 iserviceprovider 参数调用 iserviceprovider.getservice 方法,以获取一个 iwindowsformseditorservice 实例。最后,调用 iwindowsformseditorservice.dropdowncontrol 方法来显示您的自定义下拉列表控件。请记住将 editor 特性应用到使用 uitypeeditor 类的类或属性中。

    下面的屏幕快照显示了结果外观。

    图 9:在 propertygrid 中显示属性的自定义下拉列表控件

    除了使用 typeeditor 和 uitypeeditor 类外,还可以自定义 propertygrid 以显示其他属性选项卡。属性选项卡从 propertytab 类继承而来。如果您使用过 microsoft visual c#™ .net 中的属性浏览器,那么就可能看到过自定义的 propertytab。events 选项卡(带有闪电图形的按钮)就是一个自定义的 propertytab。下面的屏幕快照显示了自定义 propertytab 的另一个示例。可以使用 propertytab 编辑按钮的边界点,以创建自定义的按钮形状。

    图 10:在 propertygrid 中显示自定义选项卡

    有关使用 uitypeeditor 类自定义 propertygrid 的详细信息,以及上述自定义用户界面代码示例,请参阅 shawn burke 的文章 make your components really rad with visual studio .net property browser(英文)。

    小结

    .net 框架提供的 properygrid 控件具有丰富的编辑功能,您可以使用这些编辑功能来改善您的用户界面。propertygrid 的自定义非常简单,您可以在任何应用程序中使用这一控件。此外,由于 visual studio .net 属性浏览器是建立在 propertygrid 的基础之上的,因此您可以使用这些技术提供更丰富的设计时体验。

wpf的低调自定义属性面板PropertyGrid wpf的低调自定义属性面板PropertyGrid 引用:https://www.cnblogs.com/lsgsanxiao/p/11776421.html 当没有轮子的时候,就自己制作轮子。 前言 项目上的需求,我想需要用到这样一个跟vs属性编辑一样的东西,专业叫法,属性面板 怎么弄呢? 百度一下,wpf的PropertyGrid,如下: WPF中实现PropertyGrid的三种方式 群上问wpf跟vs属性编辑类似的东西有人弄过吗 开始 为了要体现我的卑微,这里要做一下说明 阅读详情

相关推荐

【QEMU系统分析之TPM篇(一)】

本文以 QEMU 8.2.2 为例,分析其 TPM-emulator 模块的实现,并为 QEMU 添加 Windows 平台的TPM 模拟器的支持。

David唐辉的博客 1191

C# PropertyGrid 简单使用

2. 通过Enum.ToString()实现,将String[] 变为 Enum,通过 Enum 实现下拉框。常用属性 PropertyGrid 中已经封装了下拉框属性。1. 通过继承重写 StringConverter 函数。2. 根据字段封装顺序。

Thomas会写字 7759

基于IC动态加权的机器学习多因子选股策略:从模型融合到实战回测

在量化投资领域,多因子选股模型通过挖掘市场数据中的有效信号来预测股票收益。其核心原理在于利用统计学与机器学习算法,从海量因子中识别出与未来收益具有稳定相关性的特征。这一技术的核心价值在于将主观投资决策转化为系统化、可重复的客观过程,从而在控制风险的前提下追求超额收益。其典型应用场景包括股票阿尔法策略构建、Smart Beta产品设计以及资产配置中的股票筛选环节。本文聚焦于如何通过信息系数(IC)这一关键指标,动态融合Ridge回归、MLP神经网络和随机森林等多个预测模型,构建一个能够自适应市场风格轮动的选股

weixin_34216614的博客 455

C# 控件基础2——属性配置控件PropertyGrid使用详解,PropertyGrid自定义下拉框TypeConverter,PropertyGrid自定义弹窗UITypeEditor,特性

属性配置控件PropertyGrid使用详解,PropertyGrid自定义下拉框TypeConverter,PropertyGrid自定义弹窗UITypeEditor,特性

a1062484747的博客 1万+

[USACO2023-JAN-Bronze] T2 Air Cownditioning II 题解

[USACO2023-JAN-Bronze] T2 Air Cownditioning II题解

1652

DSP复习笔记(5)——外部接口模块XINTF

【注意】 1. 芯片型号:TMS320F28335 2. 适用于NJUSTEO李彧晟老师课程 3. 参考资料:《TMS320F28335 DSP原理、开发及应用》 4. 对应PPT第二章 5. 本章内容较多而且较为重要,请结合PPT一起复习

BerenCamlost的博客 1万+

PropertyGrid使用方法

原文连接 先来转一个基础的,源自msdn http://www.microsoft.com/taiwan/msdn/library/2002/Jul-2002/article/usingpropgrid.htm 摘要: 本文旨在帮助您了解 Microsoft .NET 框架中的 PropertyGrid 控件,以及如何针对您的应用程序自定义该控件。 适用于:   &nbs...

南极没有熊的博客 3514

全志V3S嵌入式驱动开发(解决kernel 5.2.y wifi驱动问题)

​【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 wifi模块,之前测试的时候,开发板上用的是esp8089,当时内核时4.14.y,测试也是通过的。链接地址在这里, https://blog.csdn.net/feixiaoxing/article/details/131178420?spm=1001.2014.3001.5501 那个时候测试的时候,我们就说过,wifi驱动可能是除了镜像制作之外,最复杂的一个

嵌入式-老费,一个分享专业嵌入式知识的blog 1160

探索WinForms开发新境界:PropertyGrid控件的集合编辑之旅

探索WinForms开发新境界:PropertyGrid控件的集合编辑之旅 【下载地址】PropertyGrid控件显示和编辑集合教程 PropertyGrid控件显示和编辑集合教程在Windows窗体(WinForms)应用程序开发中,`PropertyGrid` 控件是一个极其强大的工具,它允许开发者以统一且直观的方...

gitblog_09758的博客 955

PCB仿真软件:Altium Designer_(6).PCB布线设计:自动布线与手工布线

通过以上步骤,我们完成了一个简单的PCB设计案例。在这个过程中,我们使用了自动布线和手工布线的综合策略,确保布线质量符合设计要求。创建PCB项目:在Altium Designer中创建一个新的PCB项目。导入原理图:将原理图文件导入到PCB项目中。设置布线规则:通过设置必要的布线规则,如线宽、间距等。启动自动布线:使用自动布线器进行初步布线。手工优化布线:通过手工布线工具优化关键信号的布线路径。保存和导出PCB文件:保存PCB文件并导出Gerber文件,用于生产。

kkchenjj的博客 2523

大模型微调部署实战及类GPT工具的高效使用

本文主要介绍了专栏《大模型微调部署实战及类GPT工具的高效使用》的核心内容,希望对使用大语言模型的同学们有所帮助。 文章目录 1. 前言 2. 专栏亮点 3. 你的收获 4. 详细目录

herosunly的博客 22万+

探索HandyControl扩展控件:ColorPicker与PropertyGrid使用详解

HandyControl是一款基于WPF的开源控件库,提供了丰富的扩展控件,帮助开发者快速构建美观且功能强大的桌面应用程序。本文将详细介绍其中两个实用控件——ColorPicker颜色拾取器和PropertyGrid属性编辑器的使用方法,让你轻松掌握这两个工具的核心功能与应用技巧。 [![HandyControl扩展控件展示](https://raw.gitcode.com/gh_mirrors

gitblog_00166的博客 532

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

探索C新境界:自定义属性在PropertyGrid中的奇妙应用

探索C#新境界:自定义属性在PropertyGrid中的奇妙应用 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在追求极致用户体验的软件开发领域,每一个细节都至关重要。特别是在C#的世界里,利用.NET框架构建高效且用户友好的应用已成为常态。而今天,我们要推荐的是一款专注于提升属性编辑界面的专业度与自定义能力的开源项目——《C# 自定义属性在PropertyGrid...

gitblog_09721的博客 375

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

告别繁琐布局:HandyControl的PropertyGrid让WPF设置面板开发效率提升80%

你是否还在为WPF应用中的设置面板开发而烦恼?手动创建数十个输入控件、编写重复的绑定代码、处理不同数据类型的编辑器适配——这些工作往往占用开发者40%以上的UI开发时间。本文将带你探索如何使用HandyControl的PropertyGrid控件,通过"模型驱动UI"的方式,仅需几行代码即可生成功能完善的设置面板,彻底解放双手。 读完本文你将掌握: - PropertyGrid的核心工作原理与数...

gitblog_01057的博客 1325

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

WPF PropertyGrid资料合集介绍

WPF PropertyGrid资料合集介绍 去发现同类优质开源项目:https://gitcode.com/ 在此项目中,我们收集整理了一系列关于WPF中PropertyGrid的资料。PropertyGrid是WPF(Windows Presentation Foundation)中一个功能强大的工具,它允许用户在一个统一的界面中查看和编辑对象的属性。 由于最近一个项目需求,我们需要利用WPF...

gitblog_06795的博客 476

【亲测免费】 探秘Avalonia.PropertyGrid:一款强大的Avalonia应用属性编辑器

探秘Avalonia.PropertyGrid:一款强大的Avalonia应用属性编辑器 在寻找一个功能完备且易于使用的属性网格控件来提升你的Avalonia应用程序的用户体验吗?Avalonia.PropertyGrid可能正是你所需要的解决方案。这款开源项目提供了丰富的特性,帮助开发者便捷地展示和编辑对象属性,让我们一起来深入了解一下它的魅力。 项目介绍 Avalonia.PropertyGr...

gitblog_00006的博客 1130

开源项目推荐:Avalonia.PropertyGrid,打造高效UI属性编辑器

开源项目推荐:Avalonia.PropertyGrid,打造高效UI属性编辑器 在当今快速发展的软件开发领域,一个强大且灵活的属性编辑器对于提升开发者和最终用户的体验至关重要。今天,我们来深入探索一款专为Avalonia平台设计的重量级工具 —— Avalonia.PropertyGrid,它不仅简化了复杂对象的可视化编辑,还提供了高度自定义的能力,让你的应用界面设计更加得心应手。 项目简介 A...

gitblog_01063的博客 633

手动动态添加PropertyGrid的数据行并显示C非属性绑定方式资源文件:解锁灵活的UI构建新方式

手动动态添加PropertyGrid的数据行并显示C#非属性绑定方式资源文件:解锁灵活的UI构建新方式 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在软件开发中,PropertyGrid控件是展示对象属性并进行编辑的强大工具,常用于配置编辑器、表单设计器等场景。本项目提供了一个独特的C#示例,演示了如何在应用程序中不通过属性绑定方式,手动动态地添加PropertyG...

gitblog_06745的博客 330

探索SnoopWPF:一款强大的WPF调试工具

探索SnoopWPF:一款强大的WPF调试工具 项目地址:https://gitcode.com/gh_mirrors/sno/snoopwpf 在Windows Presentation Foundation(WPF)开发领域,有一款名为SnoopWPF的利器,它为开发者提供了一种直观且高效的方式来调试UI布局和事件。如果你是WPF应用的开发者,或者对WPF界面有深度调整的需求,那么这款开源项目...

gitblog_00052的博客 891

为什么选择PropertyTools?探索WPF开发的10大优势

PropertyTools是一套专为WPF开发打造的自定义控件库,提供了PropertyGrid、DataGrid、多选TreeView和ColorPicker等丰富组件,帮助开发者快速构建专业级桌面应用。本文将深入解析选择PropertyTools的10大核心优势,展示它如何简化WPF开发流程并提升应用质量。 ## 1. 开箱即用的高级PropertyGrid控件 🚀 PropertyGr

gitblog_01057的博客 469

探索PropertyTools:打造高效易用的WPF界面解决方案

在软件开发中,设计和实现一个直观且功能强大的用户界面是一项挑战。幸运的是,我们发现了PropertyTools——一个专注于提升WPF应用程序界面体验的开源库。这个库包含了多种易于使用的控件,可帮助开发者快速构建出高质量的应用。 ## 项目介绍 PropertyTools 是一套精心设计的WPF控件集合,它提供了诸如属性网格、数据网格、颜色选择器等常用组件。这些控件不仅功能强大,而且经过优化,

gitblog_01124的博客 936

Dotnet专业组件开发揭密(二)

Dotnet专业组件开发揭密(二)--TypeDescriptor内部机制及其应用(上) 本文代码下载官方地址://Code/Csharp/BlogCode/TypeDescriptorDemo.rar优快云地址:http://download.csdn.net/user/BlueDog 本篇要讲述的是System.ComponentModel空间里最神奇的类,也是最

BlueDog专栏 2821

【亲测免费】 探索Extended WPF Toolkit™:打造现代化WPF应用的利器

[Extended WPF Toolkit™](https://github.com/xceedsoftware/wpftoolkit) 是由 [Xceed](https://xceed.com) 开发的一款顶级WPF控件、组件和实用工具集合。作为WPF开发者的首选工具包,它已经帮助全球超过100万开发者构建了专业、现代且易于使用的Windows应用程序。自v4.0.0版本起,该工具包以[Xcee...

gitblog_00903的博客 990

PropertyTools终极指南:深度解析WPF高级控件库的实战技巧

PropertyTools是一套为WPF开发者量身定制的高级控件库,专门解决复杂数据展示和编辑场景中的痛点问题。通过PropertyGrid、DataGrid、TreeListBox和ColorPicker等核心组件,开发者可以快速构建专业级的企业应用界面,显著提升开发效率和用户体验。 ## 一、快速入门与基础配置 ### 技巧1:高效安装与项目集成方案 要开始使用PropertyTools

gitblog_00001的博客 992

PropertyTools WPF控件库终极指南:从基础配置到高级定制完整教程

PropertyTools是一套为WPF开发者设计的专业级控件库,提供了PropertyGrid、DataGrid、TreeListBox、ColorPicker等丰富的UI组件。如果你正在开发需要复杂属性编辑、数据表格展示、树形结构导航或颜色选择功能的桌面应用程序,这个库将成为你提升开发效率的强大工具。让我们一起来探索如何将PropertyTools融入你的WPF项目,从基础配置到高级定制,构建

gitblog_00920的博客 203
上一篇: C#中什么是元数据类型
下一篇: NHibernate中使用事务
群龙
博客等级 码龄18年 22粉丝 6原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值