PropertyGrid控件 分类(Category)及属性(Property)排序

最近在做表单设计器,设计器上的控件都是我们自己封装的,但每个属性类别里的属性是按照属性的拼音排序的,现在想按照PropertyIndex标识进行排序(PropertyIndex的后三位是用来标识编辑器的)。

具体实现如下:

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.ComponentModel;
using HC.Test.ComponentModel;
using HC.Test.Common;
using System.Data;
using HC.Test.Common.ComponentModel;
using System.Xml.Serialization;
using System.Windows.Forms;
using HC.Test.Forms.ControlConfig;
using System.Collections;namespace HC.Test.Designer.UI
{public class ControlEditorTypeDescriptionProvider : TypeDescriptionProvider{protected TypeDescriptionProvider _baseProvider;private PropertyDescriptorCollection _propCache;protected Dictionary<Type, Type> dictEdtor;/// <summary>///  属性Editor字典///  Key:Attribute Value:Editor/// </summary>public Dictionary<Type, Type> EdtorDictionary{get{return dictEdtor;}}public ControlEditorTypeDescriptionProvider(): base(){dictEdtor = new Dictionary<Type, Type>();}/// <summary>/// /// </summary>/// <param name="t">要修改属性的基类</param>public ControlEditorTypeDescriptionProvider(Type t): this(){_baseProvider = TypeDescriptor.GetProvider(t);}public override ICustomTypeDescriptor GetTypeDescriptor(Type objectType, object instance){PropertiesTypeDescriptor typeDes = new PropertiesTypeDescriptor(_baseProvider.GetTypeDescriptor(objectType, instance), this, objectType);return typeDes;}}/// <summary>/// 属性集合的描述/// </summary>public class PropertiesTypeDescriptor : CustomTypeDescriptor{private Type objType;private DataTable dtConfig = new DataTable();private ControlEditorTypeDescriptionProvider provider;public PropertiesTypeDescriptor(ICustomTypeDescriptor descriptor, ControlEditorTypeDescriptionProvider provider, Type objType): base(descriptor){if (provider == null){throw new ArgumentNullException("provider");}if (descriptor == null){throw new ArgumentNullException("descriptor");}if (objType == null){throw new ArgumentNullException("objectType");}this.objType = objType;this.provider = provider;}/// <summary>/// 获取属性列表/// </summary>/// <param name="attributes"></param>/// <returns></returns>public override PropertyDescriptorCollection GetProperties(Attribute[] attributes){try{string nowIndexCode = "";Type editor;Type editorControl;Attribute abEvent;EventPropertyDescriptor des;bool showPageSize = true;//从dll中读取配置Dictionary<string, ControlEditorType> dictConfig = PubFunc.GetPropertyEditor();ArrayList orderedProperties = new ArrayList();foreach (PropertyDescriptor prop in base.GetProperties(attributes)){                   #region  控件、表单部分属性屏蔽//屏蔽所有控件数据Category 数据 属性if (((System.ComponentModel.MemberDescriptor)(prop)).Category == "数据" || ((System.ComponentModel.MemberDescriptor)(prop)).Category == "Data"){continue;}//屏蔽所有控件数据Category 杂项 属性if (((System.ComponentModel.MemberDescriptor)(prop)).Category == "杂项" || ((System.ComponentModel.MemberDescriptor)(prop)).Category == "Misc"){continue;}#endregion#region 屏蔽不需要显示的属性switch (((System.ComponentModel.MemberDescriptor)(prop)).Name){case "DisplayStyleEnum":CommonHelpDisplayStyleEnum displayType = (CommonHelpDisplayStyleEnum)prop.GetValue(this);if (displayType == CommonHelpDisplayStyleEnum.TreeStyle){showPageSize = false;}break;case "PageSize":if (!showPageSize){continue;}break;}#endregionabEvent = prop.Attributes[typeof(PropertyIndexAttribute)];if (abEvent != null && abEvent is PropertyIndexAttribute){nowIndexCode = ((PropertyIndexAttribute)abEvent).IndexCode;#region 事件编辑器处理if (nowIndexCode.Length > 6){//最后三位000标识 不带编辑器if (nowIndexCode.Substring(6, 3) == "000"){orderedProperties.Add(new PropertyOrderPair(prop.DisplayName, int.Parse(nowIndexCode), prop));continue;}foreach (var cet in dictConfig){if (cet.Key == nowIndexCode.Substring(6, 3)){//根据配置文件的序列号,获取出全名HC.Test.Designer.UI.EventActionEditorControl,放入下面的函数中                          editorControl = ReflectionActivator.GetType("HC.Test.Designer.UI", cet.Value.EditorName);if (editorControl == null){orderedProperties.Add(new PropertyOrderPair(prop.DisplayName, int.Parse(nowIndexCode), prop));break;}if (cet.Value.EditorType == "CommonTypeDropDownEditor"){editor = ReflectionActivator.GetGenericType("HC.Test.Common.Design", "HC.Test.Common.Design.GenericDropDownControlEditor`1", new Type[] { editorControl });}else{editor = ReflectionActivator.GetGenericType("HC.Test.Common.Design", "HC.Test.Common.Design.ModalFormEditor`1", new Type[] { editorControl });}des = new EventPropertyDescriptor(prop, editor);orderedProperties.Add(new PropertyOrderPair(prop.DisplayName, int.Parse(nowIndexCode), des));break;}}}#endregionelse{orderedProperties.Add(new PropertyOrderPair(prop.DisplayName, 0, prop));continue;}}else{orderedProperties.Add(new PropertyOrderPair(prop.DisplayName, 0, prop));}}//属性集合按照PropertyIndexAttribute及DisplayName排序orderedProperties.Sort();PropertyDescriptorCollection propsTemp = new PropertyDescriptorCollection(null);foreach (PropertyOrderPair pop in orderedProperties){propsTemp.Add(pop.Property);}return propsTemp;//ArrayList propertyNames = new ArrayList();//foreach (PropertyOrderPair pop in orderedProperties)//{//    propertyNames.Add(pop.Name);//}//return pdc.Sort((string[])propertyNames.ToArray(typeof(string)));}catch{throw;}}}/// <summary>/// 属性 描述(属性的属性)/// </summary>public class EventPropertyDescriptor : PropertyDescriptor{Type editor = null;PropertyDescriptor prop;public EventPropertyDescriptor(PropertyDescriptor descr, Type editor): base(descr){this.prop = descr;this.editor = editor;          }/// <summary>/// 获取Editor;/// </summary>/// <param name="editorBaseType"></param>/// <returns></returns>public override object GetEditor(Type editorBaseType){object obj = base.GetEditor(editorBaseType);if (obj == null){obj = ReflectionActivator.CreateInstace(editor);}return obj;}public override bool CanResetValue(object component){return prop.CanResetValue(component);}public override Type ComponentType{get { return prop.ComponentType; }}public override object GetValue(object component){return prop.GetValue(component);}public override bool IsReadOnly{get { return prop.IsReadOnly; }}public override Type PropertyType{get { return prop.PropertyType; }}public override void ResetValue(object component){prop.ResetValue(component);}public override void SetValue(object component, object value){prop.SetValue(component, value);}public override bool ShouldSerializeValue(object component){return prop.ShouldSerializeValue(component);}}}
PropertyIndexAttribute类:

    /// <summary>/// 属性信息的顺序分类等信息/// 字段或者属性等 可序列化的信息上/// 现在是一共9位,最后3位用来标识编辑器 最后三位000 默认不会识别编辑器/// 中间三位用来属性排序/// </summary>[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]public class PropertyIndexAttribute : Attribute{private string indexCode;/// <summary>/// 标识/// </summary>public string IndexCode{get{return indexCode;}set{indexCode = value;}}/// <summary>/// /// </summary>/// <param name="indexCode"></param>public PropertyIndexAttribute(string indexCode){this.indexCode = indexCode;}}
排序部分:

  #region Helper Class - PropertyOrderPairpublic class PropertyOrderPair : IComparable{private int _order;private string _name;public string Name{get{return _name;}}private PropertyDescriptor _property;public PropertyDescriptor Property{get{return _property;}}public PropertyOrderPair(string name, int order, PropertyDescriptor property){_order = order;_name = name;_property = property;}public int CompareTo(object obj){//// Sort the pair objects by ordering by order value// Equal values get the same rank//int otherOrder = ((PropertyOrderPair)obj)._order;if (otherOrder == _order){//// If order not specified, sort by name//string otherName = ((PropertyOrderPair)obj)._name;return string.Compare(_name, otherName);}else if (otherOrder > _order){return -1;}return 1;}}#endregion#region Helper Class - PropertyOrderAttribute 未用//[AttributeUsage(AttributeTargets.Property)]//public class PropertyOrderAttribute : Attribute//{//    ////    // Simple attribute to allow the order of a property to be specified//    ////    private int _order;//    public PropertyOrderAttribute(int order)//    {//        _order = order;//    }//    public int Order//    {//        get//        {//            return _order;//        }//    }//}#endregion
设置PropertyGrid控件的属性:


用法:

为每个属性添加属性:[PropertyIndex("103001000")]

比如:

		[Category("掩码")][Browsable(true)][DisplayName("掩码类型")]//[Description("设置执行单击事件的快捷键")][PropertyIndex("103001000")]public DevExpress.XtraEditors.Mask.MaskType MaskType{get{return this.BaseTextEdit.Properties.Mask.MaskType;}set{this.BaseTextEdit.Properties.Mask.MaskType = value;}}[Category("掩码")][Browsable(true)][DisplayName("忽略空白")][Description("对于 Simple、Regular 和 RegEx 掩码类型,MaskProperties.IgnoreMaskBlank 属性是有效的。 如果此属性值设置为 true,那么空白编辑器会失去焦点。 如果编辑器的取值仅部分完成,那么焦点不能被移出此编辑器,直至最终用户输入了完整的取值或者通过清除编辑器框而清除了取值。 如果此属性值设置为 false,那么焦点不能移出此编辑器,直至完整输入取值。 ")][PropertyIndex("103006000")]public bool IgnoreMaskBlank{get{return this.BaseTextEdit.Properties.Mask.IgnoreMaskBlank;}set{this.BaseTextEdit.Properties.Mask.IgnoreMaskBlank = value;}}[Category("掩码")][Browsable(true)][DisplayName("格式占位符")][Description("对于 Simple、Regular 和 RegEx 掩码类型,使用由 MaskProperties.PlaceHolder 属性确定的特殊字符来呈现编辑框中的占位符。 可以使用该属性来改变默认的占位符 (“_”符)。 对于 RegEx 掩码类型,通过把 MaskProperties.ShowPlaceHolders 属性设置为 false,可以隐藏占位符。 ")][PropertyIndex("103007000")]public char PlaceHolder{get{return this.BaseTextEdit.Properties.Mask.PlaceHolder;}set{this.BaseTextEdit.Properties.Mask.PlaceHolder = value;}}[Category("掩码")][Browsable(true)][DisplayName("错误提示音")][Description("对于所有类型的掩码,Boolean 型的 MaskProperties.BeepOnError 属性都是可用的。 把此属性设置为 true,当最终用户试图键入一个无效字符串时允许响铃。 假定使用了 Numeric 类型的掩码。 在这种情况下,最终用户每次试图键入非数字字符时,编辑器都将发出一段提示声音。")][PropertyIndex("103005000")]public bool BeepOnError{get{return this.BaseTextEdit.Properties.Mask.BeepOnError;}set{this.BaseTextEdit.Properties.Mask.BeepOnError = value;}}[Category("掩码")][Browsable(true)][DisplayName("自动填充")][Description("对于 RegEx 掩码类型,可以启用自动完成功能。 在这种模式中,编辑器将尝试完成已经由最终用户部分输入的取值。")][PropertyIndex("103004000")]public DevExpress.XtraEditors.Mask.AutoCompleteType AutoComplete{get{return this.BaseTextEdit.Properties.Mask.AutoComplete;}set{this.BaseTextEdit.Properties.Mask.AutoComplete = value;}}[Category("掩码")][Browsable(true)][DisplayName("保存格式字符串")][Description("对于 Simple 和 Regular 掩码类型,可以指定是否总是把显示的掩码字符 (原义字符) 包括在编辑器的取值内。 换句话说,你可以控制那些字符是否出现在由 BaseEdit.EditValue 属性返回的取值中。 要使这些字符无法被访问,则必须把 MaskProperties.SaveLiteral 属性设置为 false。 在这种情况下,如果显示的取值是“(555)123-76-34”,那么由 BaseEdit.EditValue 属性返回的取值就是“5551237634”。 ")][PropertyIndex("103008000")]public bool SaveLiteral{get{return this.BaseTextEdit.Properties.Mask.SaveLiteral;}set{this.BaseTextEdit.Properties.Mask.SaveLiteral = value;}}[Category("掩码")][Browsable(true)][DisplayName("掩码字符串")][Description("掩码字符串标识了数据输入模板。 可以使用预定义的掩码字符串,或者构建自己的掩码表达式, 应该根据掩码类型来设置掩码字符串。")][PropertyIndex("103002000")]public string EditMask{get{return this.BaseTextEdit.Properties.Mask.EditMask;}set{this.BaseTextEdit.Properties.Mask.EditMask = value;}}[Category("掩码")][Browsable(true)][DisplayName("显示格式占位符")][Description("对于 Simple、Regular 和 RegEx 掩码类型,使用由 MaskProperties.PlaceHolder 属性确定的特殊字符来呈现编辑框中的占位符。 可以使用该属性来改变默认的占位符 (“_”符)。 对于 RegEx 掩码类型,通过把 MaskProperties.ShowPlaceHolders 属性设置为 false,可以隐藏占位符。 ")][PropertyIndex("103003000")]public bool ShowPlaceHolders{get{return this.BaseTextEdit.Properties.Mask.ShowPlaceHolders;}set{this.BaseTextEdit.Properties.Mask.ShowPlaceHolders = value;}}
效果:


如果使用网络上的sort排序代码(感觉不对,于是没有采用):

  //ArrayList propertyNames = new ArrayList();//foreach (PropertyOrderPair pop in orderedProperties)//{//    propertyNames.Add(pop.Name);//}//return pdc.Sort((string[])propertyNames.ToArray(typeof(string)));
效果如下:



本文参考:

PropertyGrid排序

Ordering Items in the Property Grid

PropertyGrid类别排序实现,可以参考:

点击打开链接 

具体实现如下:

属性控件PropertyGrid事件:

 #region  属性分组排序部分private void propertyGrid_SelectedObjectsChanged(object sender, EventArgs e){propertyGrid.Tag = propertyGrid.PropertySort;propertyGrid.PropertySort = PropertySort.CategorizedAlphabetical;propertyGrid.Paint += new PaintEventHandler(propertyGrid_Paint);    }private void propertyGrid_Paint(object sender, PaintEventArgs e){var categorysinfo = propertyGrid.SelectedObject.GetType().GetField("categorys", BindingFlags.NonPublic | BindingFlags.Instance);if (categorysinfo != null){var categorys = categorysinfo.GetValue(propertyGrid.SelectedObject) as List<String>;propertyGrid.CollapseAllGridItems();GridItemCollection currentPropEntries = typeof(PropertyGrid).GetField("currentPropEntries", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(propertyGrid) as GridItemCollection;var newarray = currentPropEntries.Cast<GridItem>().OrderBy((t) => categorys.IndexOf(t.Label)).ToArray();currentPropEntries.GetType().GetField("entries", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(currentPropEntries, newarray);propertyGrid.ExpandAllGridItems();propertyGrid.PropertySort = (PropertySort)propertyGrid.Tag;}propertyGrid.Paint -= new PaintEventHandler(propertyGrid_Paint);}
由于我用的是:


所以在反射的时候,用的是:

GridItemCollection currentPropEntries = typeof(PropertyGrid).GetField("currentPropEntries", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(propertyGrid) as GridItemCollection;
而非参考文章中的:

GridItemCollection currentPropEntries = propertyGrid1.GetType().GetField("currentPropEntries", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(propertyGrid1) as GridItemCollection;


控件中的使用:



效果:


完成!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/459566.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用计算机计算出密码,自带计算器的密码

手机、电脑都会有自带的计算器&#xff0c;用惯了简易的计算器功能&#xff0c;不知道有没有感觉 iPhone 自带的计算器难用&#xff1f;后来才发现原来它还可以使用科学计算器进行指数函数、对数函数和三角函数的计算。只需要将 iPhone 转到横排模式就可以&#xff1a;这算不算…

shopify在哪里填写html,[Shopify开店教程]添加嵌入代码

添加嵌入代码在Shopify管理员中创建购买按钮后&#xff0c;您就可以将其添加到您自己的网站或博客中。将嵌入代码添加到您网站的源HTML的过程有所不同&#xff0c;具体取决于您希望购买按钮和购物车在您的发布平台上显示的方式和位置&#xff0c;以及有时您在该平台上使用的主题…

activity生命周期图

转载于:https://www.cnblogs.com/aqianglala/p/4344431.html

华硕台式计算机光盘怎么启动不了,华硕笔记本怎么用光盘重装系统 笔记本重装系统失败怎么办...

华硕笔记本是现在非常热门的笔记本品牌&#xff0c;很多的华硕笔记本用户在重装系统的时候&#xff0c;大多数会用上光盘&#xff0c;这种重装方式较为简单&#xff0c;所以备受青眯&#xff0c;不过呢还是有很多电脑用户不知道怎么用光盘重装系统&#xff0c;没关系&#xff0…

怎么安装Win10,硬盘安装Win10系统图文教程

2019独角兽企业重金招聘Python工程师标准>>> http://jingyan.baidu.com/article/f25ef254613ffd482c1b8236.html 分享到 一键分享 QQ空间 新浪微博 百度云收藏 人人网 腾讯微博 百度相册 开心网 腾讯朋友 百度贴吧 豆瓣网 搜狐微博 百度新首页 QQ好友…

游戏计算机重要参数,这真的很重要吗 游戏鼠标三大参数之谜

1游戏鼠标三大参数&#xff1a;采样率[中关村在线键鼠频道原创]游戏鼠标作为目前最受消费者关注的外设产品&#xff0c;其销量以及利润在市场上也是表现最为出色的&#xff0c;众多游戏外设厂商也推出各种各样的游戏鼠标&#xff0c;各种霸气的名字更是让我们看的眼花缭乱&…

桌面上的文件使计算机变慢吗,电脑用久了会变卡怎么办?让电脑变得流畅方法图解...

工作生活中我们的电脑时间用久了&#xff0c;就会变得很卡&#xff0c;那么如何做会让电脑变得流畅一点呢&#xff0c;小编教大家几招。步骤首先要保持windows桌面整洁&#xff0c;尽量少放一些文件&#xff0c;因为桌面上的文件都是放在C盘&#xff0c;电脑系统一般也是装在C盘…

美图秀秀计算机教程,美图秀秀怎么抠图 美图秀秀抠图详细教程

怎么抠图&#xff1f;这是很多人在进行图片处理过程中经常处理的问题。对于那些专业人士来说&#xff0c;他们大多数用的是PS软件。但是对于绝大多数没有接触过PS的小白来说&#xff0c;怎么抠图成为了一大难题。其实&#xff0c;用过美图秀秀这款软件的朋友来说&#xff0c;它…

磁盘及文件系统的管理

分区是为了创建文件系统MBR&#xff1a;创建分区后&#xff0c;为了能够快速的存取文件就有了文件系统inode&#xff1a;中存储了文件属组&#xff0c;等与文件数据没有关系的文件属性信息&#xff0c;但是没有文件名每次访问某个目录的文件时是会进行缓存的&#xff0c;在一定…

Cocos2d-x 3.8.1+Cocos Studio 2.3.2捉虫记之控制场景文件中的骨骼动画

Cocos2d-x 3.8.1Cocos Studio 2.3.2捉虫记之控制场景文件中的骨骼动画引子这段时间一直努力在把早期版本的拇指接龙游戏&#xff08;Cocos2d-x 2.2.3CocoStudio 1.4.0.1&#xff09;升级到当前相对稳定的高大上环境——Cocos2d-x 3.8.1Cocos Studio 2.3.2。行程中遇到不少麻烦&…

用JSmooth制作java jar文件的可运行exe文件教程【图文】

这是我之前在个人博客3yj上面写的一篇文章&#xff0c;如今转载过来&#xff0c;原文地址 &#xff08;这不是广告哦&#xff09; 几年前&#xff0c;刚接触java的是&#xff0c;就想用一些方法把自己的劳动果实保护起来&#xff0c;曾经也用过非常多这种工具&#xff0c;有一个…

全国计算机vb考试经典程序设计,全国计算机二级《VB语言程序设计》考试要点...

全国计算机二级《VB语言程序设计》考试要点VB语言程序设计是计算机二级考试的科目之一&#xff0c;考生们在备考是要熟悉科目的知识要点&#xff0c;有针对性地进行备考。下面百分网小编为大家搜索整理了关于二级《VB语言程序设计》考试要点&#xff0c;欢迎参考练习&#xff0…

MipMap

MipMap首先从MIPMAP的原理说起&#xff0c;它是把一张贴图按照2的倍数进行缩小。直到1X1。把缩小的图都存储起来。在渲染时&#xff0c;根据一个像素离眼睛为之的距离&#xff0c;来判断从一个合适的图层中取出texel颜色赋值给像素。在D3D和OGL都有相对应的API控制接 透过它的工…

windows2016服务器优化,Windows Server 2012 服务器优化图文方法

这篇文章主要介绍了Windows Server 2012 服务器优化图文方法,需要的朋友可以参考下1、显示桌面图片按下WinR键输入&#xff1a;rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,02、关闭IE增强的安全配置1.开启【服务器管理员】单击"服务器管理员"2.在左边窗格切…

ExtJs控件属性配置详细(转)

序言&#xff1a; 1.本文摘自网络&#xff0c;看控件命名像是4.0以前的版本&#xff0c;但控件属性配置仍然可以借鉴&#xff08;不足之处&#xff0c;以后项目用到时再续完善&#xff09;。 Ext.form.TimeField: 配置项&#xff1a; maxValue&#xff1a;列表中允许…

网站服务器中病毒该如何处理,网站被中了木马无法删除怎么办? 解决网站中病毒的办法...

紧急预警“XXCMS整站系统(XXCMS)”官方安装包被植入后门这是我们 前几天在站长网上公布的紧急预警! 但是还是有人中招了&#xff0c;服务器中了马&#xff0c;导致网站被挂了黑链&#xff0c;我们外星人源码安全小姐紧急响应&#xff0c;马上为其清除木马后门&#xff0c;查杀病…

sql语句中----删除表数据drop、truncate和delete的用法

说到删除表数据的关键字,大家记得最多的可能就是delete了 然而我们做数据库开发,读取数据库数据.对另外的两兄弟用得就比较少了 现在来介绍另外两个兄弟,都是删除表数据的,其实也是很容易理解的 老大------drop 出没场合:drop table tb --tb表示数据表的名字,下同 绝招:删除内…

MyEclipse/Eclipse 中使用javap

-c -classpath ${workspace_loc}\${project_name}\bin ${java_type_name} 特别强调我所掉过的一个坑&#xff1a;这行配置bin后面空一格而非\&#xff0c;就这个小问题让我吃了苦头 有知道原因的望告知。。。。。。。真想了解原因 转载于:https://www.cnblogs.com/blueFlowers…

怎样王远端服务器上传文件,传王电子传真使用指南-Freefax传真服务器,传王A6,免费传真...

接线方案传王A6品牌宣传为『传王&#xff0c;最棒的&#xff01;传王&#xff0c;传真之王。』,并不是一句空泛的宣传。传王A6充分考虑用户的办公环境&#xff0c;能与电话很好地混合使用&#xff0c;通过不同的接线方案&#xff0c;配合丰富的权限管理和系统设定&#xff0c;满…

《JavaScript高级程序设计》chapter 1: javascript 简介

1.2.2 文档对象模型DHTML的出现让开发人员无需重新加载页面就可以修改其外观了。1.2.3 浏览器对象模型&#xff08;BOM&#xff09;BOM真正与众不同的地方在于他作为javascript实现的一部分&#xff0c;但是却没有相关的标准。这些问题咋html5中得到解决。人们习惯上把所有针对…