c#WinForm:删除或自定义';焦点矩形';按钮

c#WinForm:删除或自定义';焦点矩形';按钮,c#,winforms,C#,Winforms,是否有一种方法可以禁用或更好地为常规按钮控件绘制自己的焦点矩形!(那条虚线看起来很像窗户) 我注意到控件属性(用于按钮)没有ownerdrawfixed设置(我不知道这是否是解决方案使用的路径,尽管我看到它用于自定义其他控件)。对Button类进行子类化并覆盖OnPaint。如果您的覆盖未调用base.OnPaint,则不会为按钮绘制任何内容,您将拥有完整的控制权(包括焦点矩形)。正确处理此问题比听起来更为棘手。毫无疑问,自定义按钮绘制不可重写的原因之一。这项工作如期进行: using Syst

是否有一种方法可以禁用或更好地为常规按钮控件绘制自己的焦点矩形!(那条虚线看起来很像窗户)


我注意到控件属性(用于按钮)没有ownerdrawfixed设置(我不知道这是否是解决方案使用的路径,尽管我看到它用于自定义其他控件)。

对Button类进行子类化并覆盖OnPaint。如果您的覆盖未调用base.OnPaint,则不会为按钮绘制任何内容,您将拥有完整的控制权(包括焦点矩形)。

正确处理此问题比听起来更为棘手。毫无疑问,自定义按钮绘制不可重写的原因之一。这项工作如期进行:

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.VisualStyles;

class MyButton : Button {
    private VisualStyleRenderer renderer;
    protected override void OnPaint(PaintEventArgs e) {
        base.OnPaint(e);
        if (this.Focused && Application.RenderWithVisualStyles && this.FlatStyle == FlatStyle.Standard) {
            if (renderer == null) {
                VisualStyleElement elem = VisualStyleElement.Button.PushButton.Normal;
                renderer = new VisualStyleRenderer(elem.ClassName, elem.Part, (int)PushButtonState.Normal);
            }
            Rectangle rc = renderer.GetBackgroundContentRectangle(e.Graphics, new Rectangle(0, 0, this.Width, this.Height));
            rc.Height--;
            rc.Width--;
            using (Pen p = new Pen(Brushes.DarkGray)) {
                e.Graphics.DrawRectangle(p, rc);
            }
        }
    }
}

我发现的一个快速/肮脏的解决方案(仅用于移除焦点矩形)是显式定义背景色。对于默认控件颜色,例如:

this._dropDownButton.BackColor = System.Drawing.ColorTranslator.FromHtml("#F0F0F0");

编辑:显然这不起作用。因为一个无关的原因,它在我的案件中被修复了。抱歉。

禁用焦点矩形的一种简单快捷的方法是将控件子类化,并包含以下代码:

public class CustomButton : Button  
{  
    protected override bool ShowFocusCues  
    {  
        get 
        {  
            return false;  
        }  
    }  
} 
简单的方法

设置

平面颜色


设置为代码原因无法在设计模式下设置透明颜色。

我在使用
BackgroundImage
设置按钮上的图像时遇到了相同的问题。当用户按下“Tab”时,“我的图像”按钮得到一个黑色矩形

对我有效的解决方案是:

  • 我用过的每一个按钮都要打电话
  • 对于我使用的每个按钮,将
    TabStop
    属性设置为false
  • 在.NET Framework 4.6.2上测试

    之前:

    之后:


    不幸的是,这对我来说不起作用-我仍然可以通过tab键或箭头键在按钮上获得一个矩形。效果非常好!谢谢不需要使用此方法重写OnPaint()。就像@theJerm一样,在Net4下,这对我也不起作用。5@Memetican,我想知道它在较低的.NET版本下是否适用?但在以后的版本中它会停止工作,这似乎很奇怪。+1这段代码工作得很好,但我不明白怎么做-没有通常为自定义控件指定的属性(如[Browseable])?谢谢。当然,没有附加属性。它只是取代了绘画。真的很神奇,只需覆盖一个基本控件中的一个方法,你就可以创建一个新控件!为什么不直接将
    BorderSize
    设置为0?如果你想要一个非常难看的扁平按钮,那就是。
    button.FlatStyle = Flat;
    button.FlatAppearance.BorderColor = Color.FromArgb(0, 255, 255, 255);
    button.FlatAppearance.BorderSize = 0;
    button.TabStop = false;