如何判断WinForms控件的属性是否为“默认”值?

时间:2011-11-24 02:57:53

标签: winforms properties controls

如何判断WinForms Control属性是否为“默认”值?

注意:在设计时,当它变为粗体时,您可以告诉该属性不再是“默认”。

  

以下是标签字体的示例(在设计时)   “默认”值(表示从父项获取其值):

     

enter image description here

     

(如果父字体发生变化,此标签的字体会发生变化)

     

此处标签的字体已更改,不再是默认值:

     

enter image description here

     

(如果父字体改变,则此标签的字体不会改变)

     

仔细观察者会注意到同一面板上的这两个标签是“相同的字体”;除了一个默认,另一个不是

注意:如果属性不是“默认”值,我需要知道运行时。 (有人可能会作弊并说,“查看属性窗口。如果属性为粗体,则表示它不再是默认的”。)

注意:注意,我的问题不仅限于标签字体 - 这只是我使用的例子。如果它仍然是默认值,我可能想知道的其他属性的示例:

  • 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;

        }
    }
*/
}

1 个答案:

答案 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());
}

我有以下属性:

  • System.ComponentModel.AmbientValueAttribute
  • System.Runtime.InteropServices.DispIdAttribute
  • System.Windows.Forms.SRCategoryAttribute
  • System.ComponentModel.LocalizableAttribute
  • System.Windows.Forms.SRDescriptionAttribute

来自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]