1

我正在尝试找出 ToolStripSplitButton。目的是在按下 ToolStripSplitButton 时显示用户控件仪表。但是,无论我尝试什么设置,按钮下方都会出现一条灰线。

ToolStrip 本身设置为 RenderMode.System,没有停靠,ToolStripSplitButton 是其中唯一的组件。

可以通过引入自定义 ToolStripRenderer 类来删除该线,但这似乎完全是为了删除控制下的这条烦人的深灰色线。

我意识到这可能完全是在黑暗中拍摄,因为我没有为这些组件提供其余的海量设置,但我希望有人能提供洞察为什么这个控件的行为方式。


我的第二个问题是关于 ToolStripSplitButton 的行为。有什么方法可以避免鼠标悬停在组件上之前显示的扁平无边框外观?我试图让它与面板中的其余按钮一起具有统一的外观,并且 ToolStripSplitButton 仅在鼠标光标放在组件上方时才会出现。

这是一个屏幕截图:

ToolStripSplitButton 有缺陷

非常感谢任何帮助!

4

2 回答 2

2
/// <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);
    }

}
于 2009-10-14T23:35:50.383 回答
1

对于任何感兴趣的人,我最终创建了一个自定义 ToolStripRenderer 类。在这里,我必须重写几个方法来获得想要的结果,结果非常好。为了绘制按钮轮廓,我简单地使用了 ControlPaint,而对于下拉选项卡式的外观,我使用 ControlDarkDark 系统颜色绘制了一些线条。为了不涉及血淋淋的细节,已经有几个教程描述了这一点。现在,从 ToolStripDropDownButton 获得类似按钮的行为似乎很奇怪,必须自己进行绘图,但我不排除某个设置可能与某处的另一个设置发生冲突。

如果有人感兴趣,我可以发布代码。

于 2009-07-14T05:40:59.030 回答