Изменить цвет границы выпадающего списка меню Winforms

c# winforms toolstripmenu

5352 просмотра

4 ответа

1353 Репутация автора

Можно ли изменить цвет границы раскрывающегося списка меню панели инструментов.

В моем примере ниже я бы хотел, чтобы раскрывающееся меню имело 1 цвет (синий) без смещения белой границы в настоящее время, но с сохранением белого цвета в главном меню («Мое меню»).

Есть идеи?

введите описание изображения здесь

Автор: Cameron Castillo Источник Размещён: 31.08.2015 09:17

Ответы (4)


0 плюса

1899 Репутация автора

Я не могу сделать демонстрационное приложение прямо сейчас, но скриншоты в этой статье http://www.vbforums.com/showthread.php?596563-100-Customizable-MenuStrip-ToolStrip-StatusStrip-StatusStrip-include-common-presets доказывают нам, что возможно изменение цвета рамки.

Этот парень разработал некоторую библиотеку, но она основана на стандартной реализации ToolStrip.

Я надеюсь, что эта ссылка будет полезна.

Автор: Andrey Shvydky Размещён: 31.08.2015 12:39

0 плюса

116 Репутация автора

Вы можете дать предметам отрицательные поля, чтобы скрыть границу.

Автор: MichaelN Размещён: 02.09.2015 01:23

12 плюса

35941 Репутация автора

Решение

Is it possible to change the border color of a toolstrip menu dropdown list.

Да. Класс, который наследуется от ProfessionalColorTableработ, как и ожидалось:

class MenuColorTable : ProfessionalColorTable
{
    public MenuColorTable()
    {
        // see notes
        base.UseSystemColors = false;
    }
    public override System.Drawing.Color MenuBorder
    {
        get{return Color.Fuchsia;}
    }
    public override System.Drawing.Color MenuItemBorder
    {
        get{return Color.DarkViolet;}
    }
    public override Color MenuItemSelected
    {
        get { return Color.Cornsilk;}
    }
    public override Color MenuItemSelectedGradientBegin
    {
        get{return Color.LawnGreen;}
    }
    public override Color MenuItemSelectedGradientEnd
    {
        get { return Color.MediumSeaGreen; }
    }
    public override Color MenuStripGradientBegin
    {
        get { return Color.AliceBlue; }
    }
    public override Color MenuStripGradientEnd
    {
        get { return Color.DodgerBlue; }
    }
}

По форме загрузить:

menuStrip1.Renderer = new ToolStripProfessionalRenderer(new MenuColorTable());

Если визуальные стили не включены, будут использоваться не все элементы таблицы цветов, а SystemColorsвместо них будут использоваться некоторые . Вы включаете визуальные стили в Main():

// must be done before any UI elements are used
Application.EnableVisualStyles();

Вы можете также отключить системные цвета, как показано в ctor. Значение по умолчанию должно быть false независимо от того, включены визуальные стили или нет, но, возможно, что-то еще изменило это?

base.UseSystemColors = false;

И то EnableVisualStyles()и другое UseSystemColors = false;должно быть на месте для реализации всех элементов рендеринга в вашей таблице цветов, в противном случае используются только некоторые. (Хотя, MenuBorderкажется, работает независимо от того, что.) В противном случае, результаты, как и ожидалось:

введите описание изображения здесь

Градиент меню переходит от AliceBlue к DodgerBlue; элемент с помощью мыши над ним использует сверху донизу градиент LawnGreen к MediumSeaGreen (мышь не показана).

введите описание изображения здесь

Когда открыто, граница меню - Fuschia (мммм, успокаивающий!)

введите описание изображения здесь

При наведении мышки на один из предметов (мышь не показана), предмет использует MenuItemSelectedцвет, который был Consilk.

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

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

Автор: Ňɏssa Pøngjǣrdenlarp Размещён: 02.09.2015 03:15

6 плюса

76062 Репутация автора

Для изменения цвета границы достаточно следовать решению Plutonix, которое описано в принятом ответе. Но чтобы удалить эту белую границу между элементом и границей меню, вы должны следовать одному из следующих решений:

Решение 1


Вы можете сделать это, внедрив свою собственную таблицу цветов, которая наследует ProfessionalColorTable и переопределив правильные свойства. Для этого выполните следующие действия:

меры

  1. Поместите ToolStrip в форму и добавьте в нее DropDownButton и его подэлементы, а для ForeColor для подэлементов установите значение White.
  2. Создайте класс CustomColorTable, унаследованный от ProfessionalColorTable
  3. Переопределите ImageMarginGradientBegin, ImageMarginGradientMiddle, ImageMarginGradientEnd, ToolStripDropDownBackground и верните желаемый цвет (синий).
  4. В вашем событии загрузки формы установите свойство Renderer ToolStripManager, чтобы использовать ToolStripProfessionalRenderer, который использует ваш CustomColorTable.

CustomColorTable Code

public class CustomColorTable:ProfessionalColorTable
{
    public override Color ImageMarginGradientBegin
    {
        get
        {
            return Color.MidnightBlue;
        }
    }

    public override Color ImageMarginGradientMiddle
    {
        get
        {
            return Color.MidnightBlue;
        }
    }

    public override Color ImageMarginGradientEnd
    {
        get
        {
            return Color.MidnightBlue; 
        }
    }

    public override Color ToolStripDropDownBackground
    {
        get
        {
            return Color.MidnightBlue;
        }
    }
}

Код загрузки формы

private void Form_Load(object sender, EventArgs e)
{
    ToolStripManager.Renderer = new ToolStripProfessionalRenderer(new CustomColorTable());
}

Скриншот

Вот нормальный скриншот

введите описание изображения здесь

И вот увеличенный в 2 раза скриншот:

введите описание изображения здесь

Решение 2


Существует также альтернативное решение, которое применимо, если вы не хотите использовать изображения в своих пунктах меню. В этом случае найдите свойство DropDown вашей выпадающей кнопки и приведите его к ToolStripDropDownMenu, затем установите для свойства ShowImageMargin его значение false, а для свойства BackColor - желаемый цвет (синий).

private void Form_Load(object sender, EventArgs e)
{
    //The item with text "My Menu" in your sample
    var dropDownMenu = (ToolStripDropDownMenu)this.myMenuToolStripDropDownButton1.DropDown;
    dropDownMenu.ShowImageMargin = false;
    dropDownMenu.BackColor = Color.Navy;
}

введите описание изображения здесь

Автор: Reza Aghaei Размещён: 02.09.2015 05:50
Вопросы из категории :
32x32