При попытке написать пользовательский элемент управления я столкнулся с проблемой с перечислением System.Windows.Forms.TextFormatFlags в сочетании с редактором Visual Studio (2005/2008). Причина этой проблемы, кажется, кроется в том факте, что в этом перечислении есть несколько членов, которые отображаются на нулевое значение. Выбор любого из этих элементов (GlyphOverhangPadding, Left, Default, Top) приводит к тому, что редактор устанавливает для свойства значение
this.customControl.TextFormatFlags = System.Windows.Forms.TextFormatFlags.GlyphOverhangPadding;
Код компилируется, как и ожидалось. Однако выбор любого ненулевого элемента (например, «Right») из сетки свойств редактора приводит к следующему:
this.customControl.TextFormatFlags = System.Windows.Forms.TextFormatFlags.Left, Default, Top, Right;
Очевидно, это не компилируется. Выбор нескольких ненулевых элементов (с помощью UITypeEditor, например, «Right | Bottom») приводит к следующему:
this.customControl.TextFormatFlags = ((System.Windows.Forms.TextFormatFlags)((System.Windows.Forms.TextFormatFlags.Left, Default, Top, Right | System.Windows.Forms.TextFormatFlags.Left, Default, Top, Bottom)));
Как видите, редактор добавляет три из четырех элементов с нулевым значением к любому выбранному элементу.
Если вы хотите воспроизвести эту проблему:
- Создание нового проекта в Visual Studio 2005/2008 (приложение Windows Forms)
- Добавить пользовательский элемент управления в проект.
Добавление частного поля и публичной собственности в новый класс:
private TextFormatFlags tff = TextFormatFlags.Default;
public TextFormatFlags TFFProperty
{
get {return this.tff; }
set {this.tff = value; }
}
Скомпилируйте код
- Откройте Form1 в конструкторе и добавьте в него CustomControl1
- Код прекрасно компилируется
- Теперь откройте свойства CustomControl1 в редакторе PropertyGrid
- Вы должны увидеть TFFProperty в разделе «Разное»
- Свойство предлагает несколько значений, большинство из которых содержат запятую.
- Выбор любого из значений через запятую (например, «Left, Default, Top, HorizontalCenter») приводит к некомпилируемому коду
То же самое происходит, если вы создаете свое собственное перечисление с атрибутом Flags и добавляете более одного члена, сопоставленного нулю (что является разновидностью перечисления неправильно сформированных флагов?) Я убедился, что это не ошибка с UITypeEditor, который я использую (та же проблема возникает без использования UITypeEditor). Я пытался обойти проблему с конвертером, но пока безуспешно. Если у кого-нибудь есть идеи, как решить эту проблему, я буду рад их услышать.