Отключение серого пользовательского контроля, если включено = false во время разработки

#c# #winforms

#c# #winforms

Вопрос:

Это мой первый вопрос, и у меня есть пользовательский контроль, который содержит другие элементы управления, такие как label и picturebox. Если я отключу пользовательский контроль, другие элементы управления также должны быть отключены во время разработки. Это означает: если я отключу пользовательский контроль, поле изображения должно быть мгновенно выделено серым цветом.

Каждый раз, когда срабатывает событие «EnabledChanged», поле изображения будет включено или отключено, но не было выделено серым цветом во время разработки. Если я запускаю код, поле с картинками становится серым.

 private void ProgressButtonImageText_EnabledChanged(object sender, EventArgs e) {
   if (Enabled == false)    
       pictureBox1.Enabled = false;
   else
       pictureBox1.Enabled = true;
}
  

Я хочу, чтобы поле с картинками было серым, когда я меняю свойство в designer. Нет, если я запускаю код, только раньше! Я заметил, что событие «EnabledChanged» не запускается во время разработки, только во время выполнения. Другие события, такие как «Щелчок», тоже запускаются во время разработки!
Как я могу достичь ожидаемого результата?

Спасибо.

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

1. Можете ли вы объяснить, почему вы хотите этого во время разработки? Если ваш элемент управления будет действительно отключен во время разработки, вы также не сможете им больше манипулировать, вы об этом подумали?

2. @GuidoG Мне нужен только эффект, подобный текстовому полю. Если я установлю для текстового поля значение Только для чтения, оно будет выделено серым цветом. Я хочу тот же эффект, потому что разработчику «легче понять», что элемент управления недоступен для пользователя во время выполнения.

3. Это не потому, что элемент управления выглядит отключенным во время разработки, он также будет отключен во время выполнения. Это может измениться в коде. Итак, если элемент управления все-таки включен во время выполнения, это снова создаст ту же путаницу, не так ли?

4. В любом случае, вы не можете иметь отключенный вид без фактического отключения, и дизайнер, вероятно, не изменит элемент управления на отключенный во время разработки. Другими словами, я не думаю, что это возможно

5. Примечание: ваш метод может быть упрощен до pictureBox1.Enabled = Enabled

Ответ №1:

Я хочу показать вам свой результат (если у вас был тот же вопрос). Я не совсем доволен, потому что я не могу переопределить «Enabled»-property . (В комментариях под моим вопросом я написал свою «новую проблему»)

Неважно..

Прежде всего, я создал новое свойство

 private bool enabled = true;
public new bool Enabled2 {
    get {...}
    set {...}
}
  

Затем я изменил «установщик» из свойства с помощью моей новой функции:

 public new bool Enabled2 {
            get { return enabled; }
            set {
                this.Enabled = enabled = pictureEdit1.Enabled = labelControl1.Enabled = value;
                if (pictureEdit1.Image != null amp;amp; !enabled)
                    pictureEdit1.Image = setImageDisabled(pictureEdit1.Image);
                else
                    //buttonImage is a property which saves the "normal" image
                    pictureEdit1.Image = buttonImage;

                //without this, the Image doesn't update
                if (DesignMode)
                    Invalidate();
            }
        }
  

И последнее, но не менее важное: моя функция «setImageDisabled»:

     private Image setImageDisabled(Image image) {
            try {
                Image grayedImage = ToolStripRenderer.CreateDisabledImage(image);
                return grayedImage;
            } catch { return null; }
        }
  

Единственная причина, по которой я хочу переопределить «Enabled»-property, заключается в том, что если другой разработчик использует этот UserControl, изображение должно быть серым, если он отключит весь элемент управления.

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

1. Хорошее начало. Вы хотите протестировать его с помощью ColorMatrix вместо этого? Таким образом, вы можете персонализировать цветовой аспект так, как хотите. Установите его, скажем, на сепию или черно-белый или что-то еще.

2. @Jimi, если у меня есть время, да, но не сейчас; D это был (для меня) самый быстрый способ, с небольшим количеством кода.

3. Я имел в виду, что если вы хотите, я могу опубликовать образец пользовательского контроллера, который реализует это поведение, используя ColorMatrix.

4. @Jimi если вы считаете, что это быстрее, тогда действуйте.