How to set/change/remove focus style on a Button in C#?

后端 未结 12 1079
鱼传尺愫
鱼传尺愫 2020-11-28 08:39

I have a couple of buttons of which I modified how they look. I have set them as flat buttons with a background and a custom border so they look all pretty and nothing like

相关标签:
12条回答
  • 2020-11-28 09:09

    I had the same issue with the annoying double border, and stumbled across this thread looking for an answer...

    The way I solved this was to set the BorderSize to 0 then draw my own border in OnPaint

    *Note: Not the entire button, just the border

    A simple example would be:

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

    In my case, this is how I made a button that mimics a ToolStripButton, where the border is only visible when you hover over the button:

    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; } }
    }
    
    0 讨论(0)
  • 2020-11-28 09:09

    Make a custom button:

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

    That'll get rid of that annoying border! ;-)

    0 讨论(0)
  • 2020-11-28 09:10

    Set the FocusVisualStyle dependency property to null in your style, and the dotted border will be gone.

    From MSDN: Styling for Focus in Controls, and FocusVisualStyle

    Windows Presentation Foundation (WPF) provides two parallel mechanisms for changing the visual appearance of a control when it receives keyboard focus. The first mechanism is to use property setters for properties such as IsKeyboardFocused within the style or template that is applied to the control. The second mechanism is to provide a separate style as the value of the FocusVisualStyle property; the "focus visual style" creates a separate visual tree for an adorner that draws on top of the control, rather than changing the visual tree of the control or other UI element by replacing it. This topic discusses the scenarios where each of these mechanisms is appropriate.

    The extra border you see is defined by the FocusVisualStyle and not in the control template, so you need to remove or override the style to remove the border.

    0 讨论(0)
  • 2020-11-28 09:11

    Another option (although a bit hacktastic) is to attach an event-handler to the button's GotFocus event. In that event-handler, pass a value of False to the button's NotifyDefault() method. So, for instance:

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

    I'm assuming this will work every time, but I haven't tested it extensively. It's working for me for now, so I'm satisfied with that.

    0 讨论(0)
  • 2020-11-28 09:11

    The second border which gets added is the Windows standard "default button" border. You may have noticed that if you tab through most dialog boxes with multiple buttons (such as any Control Panel properties window), the original "double-bordered" button becomes "normal," and the in-focus button becomes "double-bordered."

    This isn't necessarily focus at work, but rather a visual indication of the action undertaken by hitting the Enter key.

    It sounds, to me, like you don't really care about that internal working. You want the display to not have two borders -- totally understandable. The internal working is to explain why you're seeing this behavior. Now ... To try and fix it.

    The first thing I'd try -- and bear in mind, I haven't validated this -- is a hack. When a button receives focus (thereby getting the double-border), turn off your single border. You might get the effect you want, and it's pretty simple. (Hook into the Focus event. Even better, subclass Button and override OnFocus, then use that subclass for your future buttons.)

    However, that might introduce new, awkward visual side effects. In that vein -- and because hacks are rarely the best answer -- I have to "officially" recommend what others have said: Custom paint the button. Although the code here may be overkill, this link at CodeProject discusses how to do that (VB link; you'll need translate). You should, in a full-on custom mode, be able to get rid of that second border completely.

    0 讨论(0)
  • 2020-11-28 09:11

    If you have a textbox and a button then on textchange event of textbox write button1.focus();

    It will work.

    0 讨论(0)
提交回复
热议问题