0

I notice all the other controls I am using such as tabs, textboxes, rich textboxes with text already inside it and everything else resize automatically when I change the main Form font. But labels are an exception to this rule is there a property I can turn on or off in the Label that will make it resize font with the form? It is a pretty straightforward yes or no question I know how to work around it I just like how all my controls are automatically resizing without any unnecessary code.

4

1 回答 1

1

I've a solution here:

  1. If your controls have the same font with your Form's Font, you shouldn't change the particular Font of them (via the Properties window or via code), instead you just change your Form's Font. If that has already been done, you can find the code lines (normally in Form.Designer.cs) which specify Font for your controls (something like yourControl.Font = ...) and remove those lines.

  2. If your controls need different Font from your Form's. You can register the FontChanged event handler of your Form and change its children controls' Fonts accordingly (just the font size):

    private void Form1_FontChanged(object sender, EventArgs e){
       UpdateChildrenFont(this);
    }
    private void UpdateChildrenFont(Control parent){
       foreach(Control c in parent.Controls){
           c.Font = new Font(c.Font.FontFamily, parent.Font.Size, c.Font.Style);
           UpdateChildrenFont(c);
       }
    }
    

The recursive method UpdateChildrenFont works in most cases but if you have some TabControl on your form, that doesn't work, because TabControl has another kind of collection to hold its tab pages called TabPages... I've encountered such a case. Another solution is to create your own Controls and override the OnParentChanged to register the Parent.FontChanged event handler accordingly, like this:

public class YourControl : TheBaseControl {
     protected override void OnParentChanged(EventArgs e){
       if(Parent != null){
          Parent.FontChanged -= ParentFontChanged;
          Parent.FontChanged += ParentFontChanged;
       }
     }
     private void ParentFontChanged(object sender, EventArgs e){
       Font = new Font(Font.FontFamily, Parent.Font.Size, Font.Style);
     }
}

You should apply that model on all your controls on your form. That's very clean although requires you to have custom classes for your controls.

The last solution I can think of is playing with ControllAdded event, this is applied only on your Containers such as Form, GroupBox, Panel... and every control which has some child control on your form. Here is the code:

public class YourContainerClass: YourContainerBaseClass {
    protected override void OnControlAdded(ControlEventArgs e){
        Binding bind = new Binding("Font", this, "Font");
        bind.Format += (s, ev) =>
        {
            Font inFont = (Font)ev.Value;
            Binding bin = (Binding)s;
            ev.Value = new Font(bin.Control.Font.FontFamily, inFont.Size, bin.Control.Font.Style);
        };
        e.Control.DataBindings.Clear();
        e.Control.DataBindings.Add(bind);
        base.OnControlAdded(e);        
    }
}

Or simply if that's your Form:

public class Form1 : Form {
    public Form1(){
       ControlAdded += FormControlAdded;
       InitializeComponent();
    }
    private void FormControlAdded(object sender, ControlEventArgs e){
        Binding bind = new Binding("Font", this, "Font");
        bind.Format += (s, ev) =>
        {
            Font inFont = (Font)ev.Value;
            Binding bin = (Binding)s;
            ev.Value = new Font(bin.Control.Font.FontFamily, inFont.Size, bin.Control.Font.Style);
        };
        e.Control.DataBindings.Clear();
        e.Control.DataBindings.Add(bind);
    }
}
于 2013-06-18T08:06:12.570 回答