Предотвратить серые элементы управления, когда он отключен - PullRequest
4 голосов
/ 24 июля 2010

В элементах управления winforms .net, если для свойства Enabled установлено значение false, элемент управления будет недоступен.

В этом случае он станет нечитаемым для многих цветовых комбинаций (поскольку я даю варианты изменить цветформа для пользователя во время выполнения).

Я могу использовать свойство ReadOnly, но оно доступно только для элементов управления TextBox, но не для других элементов управления, таких как ComboBox, DateTimePicker и т. д.

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

Ответы [ 5 ]

7 голосов
/ 24 июля 2010

Это печальный момент в большинстве любых исследований юзабилити, когда объект ударяется о мышь и клавиатуру и не понимает, почему он не работает.Но вы можете получить это, если вы действительно хотите.Хитрость заключается в размещении графического блока перед элементом управления, который показывает растровое изображение элементов управления в их ранее включенном состоянии.Они никогда не поймут, что щелкают по растровому изображению вместо реальных элементов управления.

Лучше всего сделать с панелью, чтобы вы могли легко отключить элементы управления как группу.Добавьте новый класс в ваш проект и вставьте код, показанный ниже.Компиляция.Перетащите новый элемент управления из верхней части панели инструментов на форму.И поместите в него элементы управления, которые должны быть отключены.Все остальное происходит автоматически, просто установите для свойства Enabled значение false, и пользователь не будет знать, что произошло:

using System;
using System.Drawing;
using System.Windows.Forms;

class FakeItPanel : Panel {
    private PictureBox mFakeIt;

    public new bool Enabled {
        get { return base.Enabled; }
        set {
            if (value) {
                if (mFakeIt != null) mFakeIt.Dispose();
                mFakeIt = null;
            }
            else {
                mFakeIt = new PictureBox();
                mFakeIt.Size = this.Size;
                mFakeIt.Location = this.Location;
                var bmp = new Bitmap(this.Width, this.Height);
                this.DrawToBitmap(bmp, new Rectangle(Point.Empty, this.Size));
                mFakeIt.Image = bmp;
                this.Parent.Controls.Add(mFakeIt);
                this.Parent.Controls.SetChildIndex(mFakeIt, 0);
            }
            base.Enabled = value;
        }
    }

    protected override void Dispose(bool disposing) {
        if (disposing && mFakeIt != null) mFakeIt.Dispose();
        base.Dispose(disposing);
    }
}
2 голосов
/ 14 мая 2018

Я знаю, что это старая ветка, но случайно обнаружил альтернативное простое решение.

Создание нового прозрачного элемента управления меткой, который наследуется от метки:

class TransparentLabel : Label    {
    public TransparentLabel()
    {
        this.SetStyle(ControlStyles.Opaque, true);
        this.SetStyle(ControlStyles.OptimizedDoubleBuffer, false);
    }

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams parms = base.CreateParams;
            parms.ExStyle |= 0x20;  // Turn on WS_EX_TRANSPARENT
            return parms;
        }
    }
}

(Я не утверждаю, что изобрел этот класс, он пришел откуда-то еще, вероятно, Ганс Пассант :-))

В вашем дизайнере создайте TransparentLabel и дайте ему имя, скажем tLabel1. Установите свойства следующим образом:

  • AutoSize - Ложь, так что вы можете расширить ее, чтобы охватить все элементы управления Вы хотите отключить (это может быть целая форма, конечно).
  • Text - пусто.
  • Visible - Ложь (или оставьте это истинным, если вы хотите увидеть это в конструктор, в этом случае переместите его в конец Z-порядка, чтобы вы могли также посмотрите элементы управления, которые будут закрыты при запуске формы).

В форме выполните этот бит кода, если вы хотите отключить элементы управления:

tLabel1.Visible = true;
tLabel1.BringToFront(); // if your designer has it at the back

Это работает, потому что когда он виден, TransparentLabel получает все щелчки мыши и нажатия клавиш, а не базовый элемент управления, но он прозрачен, поэтому вы все еще видите базовые элементы управления. Щелчок правой кнопкой мыши ничего не делает, потому что у ярлыков нет контекстного меню.

Чтобы снова включить элементы управления, просто снова установите для свойства Visible значение false, и все вернется к жизни.

2 голосов
/ 24 июля 2010

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

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

Один из способов упростить вышеупомянутое решение - разработать некоторые пользовательские элементы управления, которые настраивают способ отображения данных в соответствии с правильностью, назовем это Editable элемента управления. Таким образом, вы можете создать пользовательский элемент управления, который отображает поле со списком, если Editable - true, и текстовое поле, если Editable - false. И затем соответствующий элемент управления для datatimepicker и т. Д.

2 голосов
/ 24 июля 2010

Реально вы не хотите изменять цветовое поведение отключить / включить элементы управления. Ознакомьтесь с обновленными Рекомендациями Microsoft по Windows UX от Microsoft, когда у вас появится такая возможность, так как это даст вам некоторое руководство по макету / дизайну, но если это абсолютно необходимая функция для вашего приложения, то вам нужно будет либо обработать событие рисования элементов управления самостоятельно, либо наследовать и переопределите событие рисования и нарисуйте собственные цвета, чтобы полностью контролировать этот аспект.

Моя личная рекомендация - найти другой путь, так как другие упоминали, что люди ожидают, что программы будут вести себя определенным образом, однако, если вы предоставляете функции цветовой схемы, возможно, ограничьте части приложения, которые можно изменить / персонализировать.

1 голос
/ 25 июля 2010

Если у вас есть «режим только для чтения» в вашей программе, установите флажки, опции, списки и текстовые поля в качестве меток.

Я, например, провел онлайн-тест, в котором при вводе значений, его встроенных флажков и т. Д., Но когда кто-то просматривает тест, вы видите все ответы в виде меток с выбранным значением в виде текста.Для меня это единственный способ сделать это, не нарушая привычного мышления пользовательского интерфейса как для пользователя, так и для разработчика.

Если у вас есть группа выбираемых вариантов, и вы хотите, чтобы эти варианты были видны даже при чтениитолько режим, затем запишите все варианты и отметьте выбранный вариант так, чтобы он не был похож на флажок опции och.

Это мои 5 центов в этой области.

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