Как определить, является ли свойство элемента управления WinForms значением по умолчанию? - PullRequest
3 голосов
/ 24 ноября 2011

Как узнать, является ли свойство 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 Ответ

4 голосов
/ 24 ноября 2011

С отражением вы можете проверить атрибуты для атрибута DefaultValue. PropertyGrid использует это, чтобы определить, что должно быть выделено жирным шрифтом, а что нет.

Атрибут "other" для поиска будет 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 :

Если свойство элемента управления имеет поведение окружения, этот атрибут должен присутствовать. Свойства окружения запрашивают у своего родителя свое значение, например, свойство Control.Font или свойство Control.BackColor.

Как правило, визуальный дизайнер использует атрибут AmbientValueAttribute, чтобы решить, какое значение сохранить для свойства. Обычно это значение, которое заставляет свойство получать значение из другого источника. Примером значения окружения является Color.Empty в качестве значения окружения для свойства BackColor. Если у вас есть элемент управления в форме и свойство BackColor элемента управления имеет цвет, отличный от свойства BackColor формы, вы можете сбросить свойство BackColor элемента управления на свойство формы, установив BackColor элемента управления Цвет. Пусто.

Вероятно, не облегчает то, что вы пытаетесь сделать, поскольку AmbientValue в основном говорит классу взглянуть на своего родителя. Для таких свойств, как «Шрифт», вы можете просто вызвать статическую функцию DefaultFont:

MessageBox.Show(Label.DefaultFont.ToString());

Что в моей системе приводит к:

[Шрифт: Имя = Microsoft Sans Serif, Размер = 8,25, Единицы = 3, GdiCharSet = 0, GdiVerticalFont = False]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...