Label中是否有属性允许使用类调整字体大小?

时间:2013-06-18 07:26:22

标签: c# winforms

我注意到我正在使用的所有其他控件,例如标签,文本框,内部已有文本的富文本框以及其他所有内容在我更改主Form字体时自动调整大小。但标签是这个规则的一个例外是否有一个属性,我可以在标签打开或关闭,将使其与表单调整字体大小?这是一个非常简单的是或否的问题我知道如何解决它我只是喜欢我的所有控件如何自动调整大小而没有任何不必要的代码。

1 个答案:

答案 0 :(得分:1)

我在这里有一个解决方案:

  1. 如果您的控件与Form的字体具有相同的字体,则不应更改它们的特定字体(通过“属性”窗口或通过代码),而只需更改“表单”的“字体”。如果已经完成,您可以找到代码行(通常在Form.Designer.cs中),为控件指定Font(类似yourControl.Font = ...)并删除这些行。

  2. 如果您的控件需要与表单不同Font。您可以注册表单的FontChanged事件处理程序,并相应地更改其子控件的字体(只是字体大小):

    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);
       }
    }
    
  3. 递归方法UpdateChildrenFont适用于大多数情况,但如果您的表单上有一些TabControl,那么这不起作用,因为TabControl有另一种集合来保存其标签名为TabPages的网页......我遇到过这种情况。另一个解决方案是创建自己的控件并覆盖OnParentChanged以相应地注册Parent.FontChanged事件处理程序,如下所示:

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

    您应该在表单上的所有控件上应用该模型。这很干净,但要求你有自己的控件自定义类。

    我能想到的最后一个解决方案是使用ControllAdded事件,这仅适用于Containers Form, GroupBox, Panel...以及每个在您的表单上有一些子控件的控件。这是代码:

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

    或者只是那是你的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);
        }
    }