Как установить значения по умолчанию для пользовательского элемента управления?

#c# #.net #winforms

#c# #.net #winforms

Вопрос:

Я получил пользовательский элемент управления под названием PicturePanel. В событиях мыши (MouseDown, MouseMove, MouseUp) у меня есть следующее:

 protected override void OnMouseDown(MouseEventArgs e)
{
    if (marquee == true amp;amp; e.Button == MouseButtons.Left amp;amp; BackgroundImage != null)
    {
          //Code to create rectangular marquee
    }
    else
    {

    }
}
 

Переменная уровня класса private bool marquee = false по умолчанию. И общедоступный.

 private bool marquee = false;
public bool Marquee
{
    get { return marquee; }
    set { marquee = value; }
}
 

Я даже пытался назначить инициализацию false at:

 public PicturePanel()
{
    InitializeComponent();
    marquee = false;
}
 

Но marquee всегда имеет значение true по умолчанию. Если я хочу отключить выделение, я должен установить его через общедоступную переменную picturePanel1.Marquee = false в форме. Как я могу сделать marquee false по умолчанию в пользовательском элементе управления?

Комментарии:

1. Лучше всего использовать default (T), где T может быть любым типом, который отправляет LHS, когда вы в замешательстве. bool someValue = default(bool);

Ответ №1:

Я не уверен, что это то, о чем вы говорите, но если вы имеете в виду значение по умолчанию, которое вы видите в конструкторе, то вам просто нужно добавить следующий атрибут к своему свойству:

 [DefaultValue(false)]
public bool Marquee
...
 

Комментарии:

1. Поскольку вы затронули дизайнера, я вернулся и проверил. Я не учел, что существующие элементы управления, которые я перетащил в форму, не обновляются с изменениями в классе пользовательского элемента управления. Новые элементы управления, которые я перетаскиваю в форму, имеют маркер как false.

Ответ №2:

Ну, логические значения всегда false по умолчанию. У вас случайно нет локальной переменной с именем marquee или что-то в этом роде?

Просто установите точку останова включенной private bool marquee = false; и выполните пошаговое выполнение своего кода, и вы найдете ее довольно быстро.

Комментарии:

1. Нет, есть только одна переменная marquee, которую я объявил вверху. Кроме того, если бы это было правдой, то моя общедоступная переменная Marquee не дала бы мне ожидаемого поведения. Я могу включать и выключать режим выделения с picturePanel1.Marquee = true помощью или picturePanel.Marquee = false . Но я хочу, чтобы по умолчанию шатер был выключен. И я попытался явно установить для него значение false в классе PicturePanel.

2. Логические значения @Ryder по умолчанию определенно равны false. Взгляните на документацию. msdn.microsoft.com/en-us/library/c8f5xwh7.aspx

Ответ №3:

Ваша проблема может заключаться в том, что когда вы используете конструктор для «рисования» элемента управления в форме, он может регистрировать событие наведения курсора мыши, устанавливая для маркера значение true. Вы можете предотвратить это, проверив this.DesignMode свой обработчик событий.

Пример:

 if (this.DesignMode) return;