如何在C#中设置/更改/删除按钮上的焦点样式?

我有几个按钮,我修改了它们的样子。 我已将它们设置为带有背景和自定义边框的平面按钮,因此它们看起来很漂亮而且不再像普通按钮那样(实际上,它们现在看起来像Office 2003按钮;-)。 按钮的边框为一个像素。

然而,当按钮被选中时(通过点击或键盘操作获得焦点,如按Tab键),按钮突然得到并且在它周围有相同颜色的额外边框,因此使其成为两个像素的边框。 此外,当我禁用一个像素边框时,该按钮在焦点上不会获得一个像素边框。

在网上这个问题被问了很多,比如’如何禁用对按钮的关注’,但这不是我想要的:焦点应该仍然存在 ,而不是以现在的方式显示

有什么建议? 🙂

这是你想要的效果吗?

public class NoFocusCueButton : Button { protected override bool ShowFocusCues { get { return false; } } } 

您可以像使用常规按钮一样使用此自定义按钮类,但它不会在焦点上为您提供额外的矩形。

我对烦人的双边框有同样的问题,偶然发现这个线程寻找答案……

我解决这个问题的方法是将BorderSize设置为0,然后在OnPaint中绘制自己的边框

* 注意:不是整个按钮, 只是边框

一个简单的例子是:

 public class CustomButton : Button { public CustomButton() : base() { // Prevent the button from drawing its own border FlatAppearance.BorderSize = 0; FlatStyle = System.Windows.Forms.FlatStyle.Flat; } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); // Draw Border using color specified in Flat Appearance Pen pen = new Pen(FlatAppearance.BorderColor, 1); Rectangle rectangle = new Rectangle(0, 0, Size.Width - 1, Size.Height - 1); e.Graphics.DrawRectangle(pen, rectangle); } } 

在我的例子中,这是我创建一个模仿ToolStripButton的按钮的方式,只有当您将鼠标hover在按钮上时,边框才会显示:

 public class ToolButton : Button { private bool ShowBorder { get; set; } public ToolButton() : base() { // Prevent the button from drawing its own border FlatAppearance.BorderSize = 0; // Set up a blue border and back colors for the button FlatAppearance.BorderColor = Color.FromArgb(51, 153, 255); FlatAppearance.CheckedBackColor = Color.FromArgb(153, 204, 255); FlatAppearance.MouseDownBackColor = Color.FromArgb(153, 204, 255); FlatAppearance.MouseOverBackColor = Color.FromArgb(194, 224, 255); FlatStyle = System.Windows.Forms.FlatStyle.Flat; // Set the size for the button to be the same as a ToolStripButton Size = new System.Drawing.Size(23, 22); } protected override void OnMouseEnter(EventArgs e) { base.OnMouseEnter(e); // Show the border when you hover over the button ShowBorder = true; } protected override void OnMouseLeave(EventArgs e) { base.OnMouseLeave(e); // Hide the border when you leave the button ShowBorder = false; } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); // The DesignMode check here causes the border to always draw in the Designer // This makes it easier to place your button if (DesignMode || ShowBorder) { Pen pen = new Pen(FlatAppearance.BorderColor, 1); Rectangle rectangle = new Rectangle(0, 0, Size.Width - 1, Size.Height - 1); e.Graphics.DrawRectangle(pen, rectangle); } } // Prevent Text from being set on the button (since it will be an icon) [Browsable(false)] public override string Text { get { return ""; } set { base.Text = ""; } } [Browsable(false)] public override ContentAlignment TextAlign { get { return base.TextAlign; } set { base.TextAlign = value; } } } 

制作自定义按钮:

 public partial class CustomButton: Button { public ButtonPageButton() { InitializeComponent(); this.SetStyle(ControlStyles.Selectable, false); } } 

那将摆脱那令人讨厌的边界! 😉

另一个选项(虽然有点hacktastic)是将事件处理程序附加到按钮的GotFocus事件。 在该事件处理程序中,将值False传递给按钮的NotifyDefault()方法。 所以,例如:

 void myButton_GotFocus(object sender, EventArgs e) { myButton.NotifyDefault(false); } 

我假设每次都会这样,但我没有对它进行过广泛的测试。 它现在对我有用,所以我很满意。

还有另一种适用于平面样式按钮的方法。 不要使用按钮而是使用标签。 当您完全替换按钮的UI时,无论您使用按钮控件还是标签都无关紧要。 只需以相同的方式处理点击即可。

这对我有用,虽然不是很好的练习,但这是一个很好的黑客,只要你明确地命名按钮(并评论来源),其他编码员就会接受这个想法。

瑞安

添加的第二个边框是Windows标准的“默认按钮”边框。 您可能已经注意到,如果您通过多个按钮(例如任何控制面板属性窗口)选中大多数对话框,则原始的“双边界”按钮变为“正常”,并且对焦按钮变为“双边界”。 “

这不一定是工作重点,而是通过按Enter键进行操作的直观指示。

听起来,对我而言,就像你并不真正关心内部工作一样。 您希望显示器没有两个边框 – 完全可以理解。 内部工作是解释为什么你会看到这种行为。 现在……尝试修复它。

我要尝试的第一件事 – 记住,我还没有证实这一点 – 是一个黑客。 当按钮获得焦点(从而获得双边框)时,请关闭单边框。 你可能会得到你想要的效果,而且非常简单。 (进入Focus事件。更好的是,子类Button和覆盖OnFocus,然后将该子类用于将来的按钮。)

然而,这可能会引入新的,尴尬的视觉副作用。 在那种情况下 – 因为黑客很少是最好的答案 – 我必须“正式”推荐其他人所说的:自定义绘制按钮。 虽然这里的代码可能有点过分,但CodeProject上的这个链接讨论了如何做到这一点(VB链接;你需要翻译)。 您应该在完全自定义模式下完全摆脱第二个边框。

当然你可以自己画画。 其中一个州旗是重点。

因此,在绘制事件中,如果标记被聚焦,则按照您喜欢的方式绘制按钮,否则只需将其传递给基本方法。

考虑为按钮实现自己的绘图代码。 这样你就完全可以控制了。 在过去,我已经实现了我自己的Control衍生物,它自定义绘制我的按钮并为我的目的实现所有按钮特征,但你应该能够覆盖按钮的绘画并自己动手,从而控制它在每个州的绘制方式,包括专注时。

在您的样式中将FocusVisualStyle依赖项属性设置为null,虚线边框将消失。

来自MSDN: 控件焦点样式和FocusVisualStyle

Windows Presentation Foundation(WPF)提供了两种并行机制,用于在接收键盘焦点时更改控件的可视外观。 第一种机制是在应用于控件的样式或模板中为属性(如IsKeyboardFocused)使用属性设置器。 第二种机制是提供一个单独的样式作为FocusVisualStyle属性的值; “焦点视觉样式”为绘制在控件之上的装饰器创建单独的可视树,而不是通过替换它来更改控件或其他UI元素的可视树。 本主题讨论了每种机制都适用的场景。

您看到的额外边框由FocusVisualStyle定义,而不是在控件模板中定义,因此您需要删除或覆盖样式以删除边框。

如果你有一个文本框和一个按钮,那么在文本框的textchange事件上写button1.focus();

它会工作。

您还可以创建一个隐藏按钮,并在按下另一个按钮时将其激活。

我只是将按钮的Focusable属性设置为false,我有幸运气: