Свойство UserControl типа Enum отображается в конструкторе как bool или не отображается вообще
-
09-06-2019 - |
Вопрос
У меня есть usercontrol, который имеет несколько общедоступных свойств.Эти свойства автоматически отображаются в окне свойств конструктора VS2005 в категории "Разное".За исключением двух свойств, которые являются перечислениями, отображаются некорректно.
Первое включение использует следующее перечисление:
public enum VerticalControlAlign
{
Center,
Top,
Bottom
}
Это не отображается в конструкторе вообще.
Второй использует это перечисление:
public enum AutoSizeMode
{
None,
KeepInControl
}
Этот появляется, но дизайнер, похоже, думает, что это bool и показывает только True и False.И когда вы создадите проект с помощью элементов управления, он скажет, что не может преобразовать тип bool в AutoSizeMode.
Кроме того, эти перечисления объявляются глобально для пространства имен, поэтому они доступны везде.
Есть какие-нибудь идеи?
Решение
Для начала, второе перечисление, AutoSizeMode, объявлено в Системе.Windows.Формы.Так что это может вызвать у дизайнера некоторые проблемы.
Во-вторых, вам может оказаться полезной следующая страница в MSDN:
Другие советы
Я провел небольшой тест с вашей проблемой (я не уверен, правильно ли я ее понял), и эти свойства отображаются в конструкторе правильно, и все перечисления отображаются соответствующим образом.Если это не то, что вы ищете, тогда, пожалуйста, объяснитесь подробнее.
Не зацикливайтесь на _углой части, брошенной туда.Я просто использовал его для быстрого теста.
using System.ComponentModel;
using System.Windows.Forms;
namespace SampleApplication
{
public partial class CustomUserControl : UserControl
{
public CustomUserControl()
{
InitializeComponent();
}
/// <summary>
/// We're hiding AutoSizeMode in UserControl here.
/// </summary>
public new enum AutoSizeMode { None, KeepInControl }
public enum VerticalControlAlign { Center, Top, Bottom }
/// <summary>
/// Note that you cannot have a property
/// called VerticalControlAlign if it is
/// already defined in the scope.
/// </summary>
[DisplayName("VerticalControlAlign")]
[Category("stackoverflow.com")]
[Description("Sets the vertical control align")]
public VerticalControlAlign VerticalControlAlign_Ugly
{
get { return m_align; }
set { m_align = value; }
}
private VerticalControlAlign m_align;
/// <summary>
/// Note that you cannot have a property
/// called AutoSizeMode if it is
/// already defined in the scope.
/// </summary>
[DisplayName("AutoSizeMode")]
[Category("stackoverflow.com")]
[Description("Sets the auto size mode")]
public AutoSizeMode AutoSizeMode_Ugly
{
get { return m_autoSize; }
set { m_autoSize = value; }
}
private AutoSizeMode m_autoSize;
}
}
Вам не нужно делать ваши перечисления глобальными, чтобы они были видны в конструкторе.
Уточните, пожалуйста:
- если вы добавите другое значение в свое перечисление AutoSizeMode, будет ли оно по-прежнему отображаться как логическое?
- Если (вместо этого) вы измените имя enum, будет ли оно по-прежнему отображаться как логическое значение?
Некоторые вещи, которые стоит попробовать (режим конструктора в VS2005, который я нахожу несколько неустойчивым):
- Откройте свой web.config и добавьте:
batch="false"
к вашему<compilation>
бирка. Попробуйте установить значения по умолчанию для ваших перечислений:
public enum VerticalControlAlign { Center = 0, Top = 1, Bottom = 2 }