如何获得控件's字体的默认值?

本文关键字:字体 默认值 何获得 控件 | 更新日期: 2023-09-27 18:17:03

我试图得到一个控件的字体的默认值,所以我可以确定它是否是当前的默认值。

如何获得控件字体的默认值?


i trying 通过反射获取Font属性的DefaultValue属性:

// Gets the attributes for the property.
AttributeCollection attributes = TypeDescriptor.GetProperties(label1)["ForeColor"].Attributes;
//Find the "DefaultValue" attribute
DefaultValueAttribute myAttribute = (DefaultValueAttribute)attributes[typeof(DefaultValueAttribute)];

除非没有默认值属性(myAttribute为null)


然后我意识到有AmbientValue属性,这意味着属性的值来自控件的父控件。

control.Parent链上发现每个控件都有一个AmbientValue属性标签,一直到Form

  • label1 [AmbientValue] (no DefaultValue)
    • form1 [AmbientValue] (no DefaultValue)
      • null

那么我如何获得控件的Font属性的默认值?

如何获得控件's字体的默认值?

如果你说的是WinForms,我认为Control。DefaultFont属性应该有所帮助。

我的理解是,"默认字体"是指直接分配的字体,而不是继承的环境字体。

在Control类中,有一个名为IsFontSet的内部方法。如果Font为空,它将返回false。
bool? IsFontSet = null;
try {
    Type t = typeof(Control);
    System.Reflection.MethodInfo mi = t.GetMethod("IsFontSet", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
    if (mi != null) {
        IsFontSet = (bool?) mi.Invoke(view, null);
    }
} catch {}

使用了一个可空bool值,因此如果方法名改变,它的值将为空。使用try-catch,以便如果返回类型从bool更改为其他类型,代码不会崩溃。