如何判断WinForms Control
的属性是否为“默认”值?
注意:在设计时,当它变为粗体时,您可以告诉该属性不再是“默认”。
以下是标签字体的示例(在设计时) “默认”值(表示从父项获取其值):
(如果父字体发生变化,此标签的字体会发生变化)
此处标签的字体已更改,不再是默认值:
(如果父字体改变,则此标签的字体不会改变)
仔细观察者会注意到同一面板上的这两个标签是“相同的字体”;除了一个默认,另一个不是。
注意:如果属性不是“默认”值,我需要知道运行时。 (有人可能会作弊并说,“查看属性窗口。如果属性为粗体,则表示它不再是默认的”。)
注意:注意,我的问题不仅限于标签字体 - 这只是我使用的例子。如果它仍然是默认值,我可能想知道的其他属性的示例:
ForeColor
BackColor
ToolStrip.ImageScalingSize
SplitContainer.FixedPanel
我的疯狂尝试
我将在这里留下这些失败的随机漫游代码呕吐尝试:
internal static Boolean GetIsPropertyDefault(object o, string propertyName)
{
return false;
/* Debug.WriteLine(String.Format("GetIsPropertyDefault: {0}.{1} = {2}", o, propertyName, TypeDescriptor.GetProperties(o)[propertyName].GetValue(o)));
// Gets the attributes for the property.
AttributeCollection attributes = TypeDescriptor.GetProperties(o)[propertyName].Attributes;
DefaultValueAttribute myAttribute = (DefaultValueAttribute)attributes[typeof(DefaultValueAttribute)];
Debug.WriteLine(String.Format("The default value is: {0}", myAttribute));
if (myAttribute == null)
return true;
return (TypeDescriptor.GetProperties(o)[propertyName].GetValue(o) == myAttribute.Value);
*/
// return (myAttribute.Value == null);
// Console.WriteLine("The default value is: " + myAttribute.Value.ToString());
/* System.Reflection.PropertyInfo pi;
try
{
//pi = o.GetType().GetProperty(propertyName).GetCustomAttributes(typeof(DefaultAttribute), false).
}
catch
{
return true;
}
if (pi == null)
return true;
System.Diagnostics.Trace.TraceInformation(pi.Attributes.ToString());
*/
// return false;
/* foreach (Attribute attr in pi.Attributes)
{
if (attr is System.ComponentModel.DefaultValueAttribute)
{
System.ComponentModel.DefaultValueAttribute dv = (System.ComponentModel.DefaultValueAttribute)attr;
}
}
*/
}
答案 0 :(得分:4)
通过反射,您可以检查DefaultValue
属性的属性。 PropertyGrid使用它来确定什么应该是粗体,什么不应该。
要查找的“其他”属性是AmbientValueAttribute
。
当我这样做时:
List<string> list = new List<string>();
Attribute[] attrs = Attribute.GetCustomAttributes(typeof(Label).GetProperty("Font"));
foreach (Attribute att in attrs) {
list.Add(att.ToString());
}
我有以下属性:
来自AmbientValueAttribute Class:
如果控件上的属性具有环境行为,则必须存在此属性。环境属性查询其父级的值,例如,Control.Font属性或Control.BackColor属性。
通常,可视化设计器使用AmbientValueAttribute属性来决定要为属性保留哪个值。这通常是一个值,该属性使属性从另一个源获取其值。环境值的一个示例是Color.Empty作为BackColor属性的环境值。如果您在窗体上有一个控件,并且控件的BackColor属性设置为与窗体的BackColor属性不同的颜色,则可以通过设置控件的BackColor将控件的BackColor属性重置为窗体的属性到Color.Empty。
可能不会让你想要做的更容易,因为AmbientValue基本上告诉班级看它的父母。对于像“Font”这样的属性,您只需调用静态函数DefaultFont:
MessageBox.Show(Label.DefaultFont.ToString());
在我的系统上,结果是:
[字体:名称= Microsoft Sans Serif,Size = 8.25,Units = 3,GdiCharSet = 0,GdiVerticalFont = False]