Winforms ToolStripSplitButton отображается с серой линией под ним, и поднимается только тогда, когда курсор мыши над ним - PullRequest
1 голос
/ 13 июля 2009

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

Сама ToolStrip установлена ​​в RenderMode.System, не закреплена, и ToolStripSplitButton является единственным компонентом в нем.

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

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


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

Вот скриншот:

ToolStripSplitButton flawed

Любая помощь очень ценится!

Ответы [ 2 ]

2 голосов
/ 15 октября 2009
/// <summary>
/// This class provides custom rendering code for the ToolStrip and ToolStripDropDownButton because the standard windows
/// rendering gave it a very flat look.
/// </summary>
public class CustomToolStripRenderer : ToolStripRenderer {
    ToolStripDropDownButton toolStripDDButton;

    public CustomToolStripRenderer(ToolStripDropDownButton toolStripDropDownButton) : base() {
        toolStripDDButton = toolStripDropDownButton;
    }

    //protected override void OnRenderButtonBackground(ToolStripItemRenderEventArgs tsirea) {
    //    // Check if the item is selected or hovered over.
    //    if (tsirea.Item.Selected || tsirea.Item.Pressed) {
    //        LinearGradientBrush brush = new LinearGradientBrush(tsirea.Item.Bounds, Color.DarkBlue, Color.DarkGreen, 90);
    //        tsirea.Graphics.FillRectangle(brush, 0, 0, tsirea.Item.Width, tsirea.Item.Height);
    //    }
    //}

    protected override void OnRenderToolStripBackground(ToolStripRenderEventArgs tsrea) {
        // This event occurs before the OnRenderDropDownButtonBackground event...

        if (toolStripDDButton.Pressed) {
            base.OnRenderToolStripBackground(tsrea);
        }
        else if (toolStripDDButton.Selected) {
            ControlPaint.DrawButton(tsrea.Graphics, tsrea.AffectedBounds, ButtonState.Normal);
        }
        else {
            ControlPaint.DrawButton(tsrea.Graphics, tsrea.AffectedBounds, ButtonState.Normal);
        }
    }

    //protected override void OnRenderDropDownButtonBackground(ToolStripItemRenderEventArgs tsirea) {
    //    // Happens every time the button is hovered over as well, and upon mouseleave

    //    //ControlPaint.DrawButton(tsirea.Graphics, tsirea.Item.ContentRectangle, ButtonState.Normal);
    //    base.OnRenderDropDownButtonBackground(tsirea);
    //}

    protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs tsrea) {
        //This event occurs after the OnRenderDropDownButtonBackground event...
        //Thus it will paint over whatever is already painted in the OnRenderDropDownButtonBackground event.

        //Debug.Println("OnRenderToolStripBorder");
        if (toolStripDDButton.Pressed) {
            // Draw the top and left borders of the component so that it looks like a tab page:
            tsrea.Graphics.DrawLine(SystemPens.ControlDarkDark, tsrea.AffectedBounds.Left, tsrea.AffectedBounds.Top, tsrea.AffectedBounds.Left, tsrea.AffectedBounds.Bottom);
            tsrea.Graphics.DrawLine(SystemPens.ControlDarkDark, tsrea.AffectedBounds.Left, tsrea.AffectedBounds.Top, tsrea.AffectedBounds.Right, tsrea.AffectedBounds.Top);
        }
        base.OnRenderToolStripBorder(tsrea);
    }

}
1 голос
/ 14 июля 2009

Для всех, кто заинтересовался, в конце концов я создал собственный класс ToolStripRenderer. Здесь мне пришлось переопределить несколько методов, чтобы получить желаемый результат, и результат получился довольно приятным. Чтобы нарисовать контур кнопки, я просто использовал ControlPaint, а для выпадающего вида, похожего на вкладку, я нарисовал несколько линий системным цветом ControlDarkDark. Чтобы не вдаваться в подробности, есть несколько уроков, описывающих это уже. Теперь кажется странным, что для получения поведения кнопки, похожего на ToolStripDropDownButton, необходимо сделать рисование самостоятельно, но я не исключаю, что параметр мог где-нибудь конфликтовать с другим.

Я могу опубликовать код, если кому-то интересно.

...