Как получить отключенную ToolStripButton для рисования своего изображения в цвете?

У нас есть кнопка, которая позволяет пользователям "заблокировать" форму. Пользователям не разрешается "разблокировать" форму, поэтому при нажатии мы хотим, чтобы кнопка была отключена, чтобы пользователь получал соответствующую визуальную обратную связь.

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

Как мы это сделаем, с абсолютным минимальным количеством переопределенной живописи?

4 ответа

Вы можете установить ToolStripButton Image как BackgroundImage
а затем установите DiplayStyle в None,

Изображение должно оставаться в цвете независимо от того, что кнопка Enabled значение.

На самом деле я не согласен с подходом. У вашего клиента может быть правильное мнение, но я не думаю, что у него есть правильное предложение для исправления. Вы должны искать другие способы сделать форму "заблокированной". Изменение границ или цветов шрифта, появление большого значка замка или изменение с открытого на закрытое и т. Д. Кнопки выглядят определенным образом, потому что именно этого ожидают пользователи. Если у вас есть отключенная кнопка, которая выглядит так, как будто она может быть включена, это может сбить с толку пользователей, которые могут не понять, почему они не могут нажать на нее.

Я был в этом случае несколько недель назад, и на этот вопрос нет ответа, так что это мое решение 4 года спустя:

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

  1. переопределить событие OnPaint или изменить средство визуализации вашей ToolStrip
  2. с помощью этого метода нарисуйте свое изображение без серого фильтра, просто установите изображение кнопки и положение изображения на ней: http://msdn.microsoft.com/en-us/library/chas0s9c(v=vs.110).aspx

Два хороших примера, которые мне помогли:

Класс ToolStrip:

ToolStrip ts = new ToolStrip();
//[...]
ts.RenderMode = ToolStripRenderMode.Professional; //Professional is just an example
ts.Renderer = new CustomRenderer();

Класс CustomRenderer:

public class CustomRenderer: ToolStripProfessionalRenderer
{
    protected override void OnRenderButtonBackground(ToolStripItemRenderEventArgs e)
    {
        if (!e.Item.Enabled) //in this case you will just have the image in your button, you need to add text etc in this if
        {
             //to draw the image
             Graphics g = e.Graphics;
             g.DrawImageUnscaled(e.Item.Image, new Point(2, 2)); //you need to specify the correct position
        }
        else //other cases
            base.OnRenderButtonBackground(e);
     }
}

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

Другой способ: не устанавливайте button.Enabled = false совсем. Просто установите button.Checked = true или же false и когда кто-то нажимает на кнопку теста для Checked заявляй и делай что делаешь. Кнопка будет функционировать так, как вы хотите, и оставаться цветным.

Другие вопросы по тегам