«Белая полоса» в MenuStripDropDown

В настоящее время у меня есть пользовательский Render, настроенный для MenuStrip в приложении Windows Forms на С#:

        private class HeaderMenuRender : ProfessionalColorTable
    {
        public override Color MenuItemSelectedGradientBegin
        {
            get
            {
                return Color.Gray;
            }
        }

        public override Color MenuItemSelectedGradientEnd
        {
            get
            {
                return Color.Gray;
            }
        }

        public override Color MenuItemPressedGradientBegin
        {
            get
            {
                return Color.Gray;
            }
        }

        public override Color MenuItemPressedGradientEnd
        {
            get
            {
                return Color.Gray;
            }
        }

        public override Color MenuItemBorder
        {
            get
            {
                return Color.Gray;
            }
        }

        public override Color MenuBorder
        {
            get
            {
                return Color.Gray;
            }
        }
    }

Затем это применяется к существующему элементу управления MenuStrip в форме для создания пользовательского рендеринга.

Однако при запуске приложения и выполнении выбора в отображаемом меню, несмотря на то, что параметры меню имеют правильный цвет, появляется небольшая полоса «Белый» (возможно, это может быть цвет «Управление»), которая охватывает длину выбранного MenuStrip. вариант (указан в синем поле ниже):

MenuStrip

Есть ли какое-то конкретное свойство пользовательского Renderer, которое я не включаю, или что-то, что мне не хватает, которое устанавливает эту конкретную часть выбранного элемента MenuStrip? Примеры, которые я видел в других местах, похоже, не имеют этой проблемы.


person Your_Unequal    schedule 01.12.2015    source источник


Ответы (1)


В приведенном выше коде кажется, что вы создали элементы Gray, используя свойство BackColor.

Вы можете использовать переопределение ToolStripDropDownBackground, чтобы вернуть Color.Gray, это удалит эту строку while.

Также вы можете переопределить ImageMarginGradientBegin, ImageMarginGradientMiddle и ImageMarginGradientEnd, чтобы также сделать область изображения/флажка Gray.

Вот что я добавил к вашим кодам, чтобы получить желаемое значение:

public override Color ImageMarginGradientBegin
{
    get { return Color.Gray; }
}

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

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

public override Color ToolStripDropDownBackground
{
    get { return Color.Gray; }
}
person Reza Aghaei    schedule 01.12.2015
comment
Быстро, просто, чисто. Нравится. Также менее требователен, поскольку вы правы, он устанавливает BackColor каждого отдельного элемента ToolStripMenuItem, не обязательно просто изменяя цвет самого MenuStrip, используя ряд различных переопределений; просто глядя на него, можно предположить, что есть лучший способ сделать это, поскольку на самом деле он не использует градиент по прямому назначению. Я также сделал значки серыми, но лучше вообще убрать поля изображения значков. В настоящее время возникают некоторые проблемы с удалением тех, кто находится в подменю, но я хочу сначала рассмотреть это подробнее, так как это отдельная проблема. - person Your_Unequal; 01.12.2015
comment
Добро пожаловать. Кстати, вы также можете проголосовать за ответ, когда примете его, это вовсе не обязательно, но разумно и рекомендуется, и это ваша доброта :) - person Reza Aghaei; 01.12.2015
comment
Это ваша доброта :) - person Reza Aghaei; 01.12.2015
comment
Удивительно. Просто удивительно. - person Momoro; 22.05.2020