【问题标题】:C#: Disappearing arrow after OnRenderSplitButtonBackground overrideC#:OnRenderSplitButtonBackground 覆盖后消失的箭头
【发布时间】:2020-12-16 17:23:02
【问题描述】:

我试图使用覆盖来更改 ToolStripSplitButton 的背景,但这样做时,下拉菜单上的箭头会在悬停在按钮上时消失。

代码:

protected override void OnRenderSplitButtonBackground(ToolStripItemRenderEventArgs e)
{
    if (!e.Item.Selected)
    {
        base.OnRenderSplitButtonBackground(e);
    }
    else
    {
        Rectangle button = new Rectangle(0, 0, e.Item.Size.Width - 12, e.Item.Size.Height - 1);
        e.Graphics.FillRectangle(Brushes.White, button);
        e.Graphics.DrawRectangle(Pens.Olive, button);

        Rectangle dropdown = new Rectangle(e.ToolStrip.Items[0].Size.Width - 1, 0, e.Item.Size.Width - 32, e.Item.Size.Height - 1);
        e.Graphics.FillRectangle(Brushes.White, dropdown);
        e.Graphics.DrawRectangle(Pens.Olive, dropdown);
    }
}

结果如下:

我知道OnRenderArrow 存在,我也尝试过覆盖它,但它看起来像是被OnRenderSplitButtonBackground 中的dropdown 矩形“覆盖”了。

我应该如何解决这个问题?提前致谢!

【问题讨论】:

    标签: c# background toolstrip toolstripbutton


    【解决方案1】:

    如果您将e.Item 属性返回的基类(ToolStripItem)转换为ToolStripSplitButton 类,您将获得所有相关属性来绘制拆分按钮的不同部分。

    边界属性,例如ButtonBoundsDropDownButtonBoundsSplitterBounds。国家财产; ButtonPressed, ButtonSelected, DropDownButtonPressed, ...等等。

    至于箭头部分。您需要调用OnRenderArrow 方法。

    示例

    protected override void OnRenderSplitButtonBackground(ToolStripItemRenderEventArgs e)
    {
        if (!e.Item.Selected || e.Item.Pressed)
            base.OnRenderSplitButtonBackground(e);
        else
        {
            var sb = e.Item as ToolStripSplitButton;
            var button = sb.ButtonBounds;
            var dropdown = sb.DropDownButtonBounds;
    
            button.Width--;
            button.Height--;
            dropdown.Width--;
            dropdown.Height--;
    
            var br = sb.ButtonPressed ? Brushes.Gainsboro : Brushes.White;
    
            e.Graphics.FillRectangle(br, button);
            e.Graphics.DrawRectangle(Pens.Olive, button);
            e.Graphics.FillRectangle(Brushes.White, dropdown);
            e.Graphics.DrawRectangle(Pens.Olive, dropdown);
    
            OnRenderArrow(new ToolStripArrowRenderEventArgs(
                e.Graphics, e.Item, sb.DropDownButtonBounds, e.Item.ForeColor,
                ArrowDirection.Down));
        }
    }
    

    【讨论】:

    • 非常感谢,这简直太棒了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    相关资源
    最近更新 更多