2015-08-31 3 views
8

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

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

Любые идеи?

enter image description here

+0

Вы смотрели на этот вопрос: http://stackoverflow.com/questions/13235627/how-to-change-the-appearance-of-a-menustrip? –

+0

Хм, это может быть дубликат. Но я до сих пор не знаю, какое свойство переопределить, чтобы получить желаемый эффект. Я пробовал MenuItemBorder и MenuBorder, но он не меняется. –

+1

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

ответ

10

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. По умолчанию должно быть неверно, включены ли визуальные стили или нет, но, возможно, что-то еще изменило его?

base.UseSystemColors = false; 

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

enter image description here

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

enter image description here

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

enter image description here

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

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

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

+0

Спасибо, это хороший ответ. Любая идея, каков метод переопределения для изменения цвета шрифта выбранного пункта меню (верхнее меню, а не выпадающее меню)? –

+0

Разве это не стандартная собственность? 'menuStrip1.BackColor', похоже, только что изменит текст меню Top/Main. Также есть события MouseEnter/MouseLeave, если вы хотите изменить некоторые изменения для эмуляции эффекта Glow. Это может быть утомительным, хотя – Plutonix

0

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

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

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

+0

Tx, не уверен, что я что-то пропустил, но границы на этом скриншоте все еще белые (для выпадающего меню). –

+0

Это окно: http://i48.tinypic.com/2mzjfva.jpg имеет темно-красную границу. Некоторая дополнительная белая граница вызвана фоном. –

+0

Это лишние белые границы, о которых я говорю. На моем скриншоте у меня также есть фон другого цвета (согласно вашему снимку экрана). Но у обоих есть эта маленькая смешная белая граница. –

0

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

6

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

Solution 1


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

Шаги

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

CustomColorTable Код

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()); 
} 

Скриншот

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

enter image description here

А вот 2x увеличенный скриншот:

enter image description here

Раствор 2


Существует также альтернативная решение, которое применимо, если вы не хотите для использования изображений в пунктах меню. В этом случае найдите свойство DropDown вашего dropdownbutton и отбросите его в 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; 
} 

enter image description here

+0

Спасибо за ответ. Это также хороший ответ, но я сначала увидел ответ ниже и выполнил всю эту реализацию. К сожалению, я могу только принять 1 ответ. –