C#進行language切換時候label大小能否跟隨語系變化?form的size為什麼會出現自動改變

.Net技术 码拜 8年前 (2016-09-13) 2010次浏览
在VS中做了一个winform程序,现在准备添加多语系,问了度娘,使用了ResourceManager,可以实现制作不同语言的界面,但是出现两个问题,弄了很久没有解决。
问题一:本人在属性中切换language到英语,然后将界面上面的label的text属性修改成对应的英语,原因是中文比较简洁,label的长度很短,英文比较长,中文界面中的位置根本不能完整的显示出来,所以本人调整了label的大小和位置。但是,在运行时候,发现英文语系下的lablel显示的位置和大小都没有发生改变,还是按照中文语序下的位置和大小,为什么?可以实现改变吗?
问题二:在没有做语系切换和修改language属性时候,form的size属性是1366*768,也是适合本人屏幕的分辨率。当本人为了做多语系,在form的属性中切换language到英语后,出现了form的size属性自动更改的情况,自动改变成为1362*742,这也是本人第一次遇到这样的情况。并且,本人再次手动修改为1366*768之后,只要进行language切换,form的size就会自动改变。
功力比较菜,本人解决不了,希望大家帮忙,稍微详细点!
解决方案

30

你这是通过代码手动绑定,.Net中只有特殊情况才用
本人上面说的,只需要通过界面设计器来设置完成
唯一可能需要写代码的地方,就是代码中切换语言(其实就是切换前台线程的UI CultureInfo到相应的语言)
例如,可以在Program.cs中加个静态属性
/// <summary>
/// 获取或设置程序的UI线程为指定的语言文化
/// </summary>
public static Language Language
{
get
{
return _language;
}
set
{
_language = value;
var cultureName = _language.ToString().Replace(“_”, “-“);
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(cultureName);
}
}
public enum Language
{
zh_CN = 0,
en_US = 1
}
//切换语言,通常放在主窗口显示之前
Program.Language = Language.en_US;
要在运行的过程中随时切换,有些复杂控件可能要写点代码来适配

30

/// <summary>
        /// 动态加载资源文件
        /// </summary>
        /// <param name="form"></param>
        public static ComponentResourceManager ApplyResource(this Form form)
        {
            var resources = new System.ComponentModel.ComponentResourceManager(form.GetType());
            form.SuspendLayout();
            resources.ApplyResources(form, "$this");
            ApplyChildrenResources(resources, form);
            //主菜单
            if (form.MainMenuStrip != null)
            {
                form.MainMenuStrip.ApplyMenuItemsResources(resources);
            }
            //右键菜单
            if (form.ContextMenuStrip != null)
            {
                form.ContextMenuStrip.ApplyMenuItemsResources(resources);
            }            
            form.ResumeLayout();
            return resources;
        }
        public static void ApplyChildrenResources(ComponentResourceManager resources, Control parent)
        {
            foreach (Control ctrl in parent.Controls)
            {                
                if (ctrl is UserControl)
                {
                    //加载用户控件的资源
                    ctrl.SuspendLayout();
                    var ucResources = new System.ComponentModel.ComponentResourceManager(ctrl.GetType());
                    ucResources.ApplyResources(ctrl, "$this");
                    ApplyChildrenResources(ucResources, ctrl);
                    ctrl.ResumeLayout();                    
                }
                else                
                {
                    var menu = ctrl as ToolStrip;
                    if (menu != null)
                    {
                        menu.ApplyMenuItemsResources(resources);
                    }                    
                    else
                    {
                        var dgv = ctrl as DataGridView;
                        if (dgv != null)
                        {
                            foreach (DataGridViewColumn col in dgv.Columns)
                            {
                                resources.ApplyResources(col, col.Name);
                            }
                        }
                        else
                        {
                            var combox = ctrl as ComboBox;
                            if (combox != null && combox.Items.Count != 0)
                            {
                                combox.Items[0] = Resources.DefaultSelectedItem;
                            }
                        }                        
                    }
                }
                resources.ApplyResources(ctrl, ctrl.Name);
                ApplyChildrenResources(resources, ctrl);
            }
        }
        public static void ApplyMenuItemsResources(this ToolStrip menu, ComponentResourceManager resources)
        {
            foreach (ToolStripItem item in menu.Items)
            {
                resources.ApplyResources(item, item.Name);
                var dropDownItem = item as ToolStripDropDownItem;
                if (dropDownItem != null)
                {
                    dropDownItem.ApplyDropDownItemsResources(resources);
                }
            }
        }
        static void ApplyDropDownItemsResources(this ToolStripDropDownItem parentItem, ComponentResourceManager resources)
        {
            if (parentItem.HasDropDownItems)
            {
                foreach (ToolStripDropDownItem subItem in parentItem.DropDownItems)
                {
                    resources.ApplyResources(subItem, subItem.Name);
                    subItem.ApplyDropDownItemsResources(resources);
                }
            }
        } 

上面考虑了用户控件和常用的控件,基本够用了。最好是在Form抽象层加两个事件
Program.Language = Language.en_US;
foreach(var form in Application.OpenForms)
{
form.OnLanguageChanging(form, EventArgs.Empty);
form.ApplyResource();
form.OnLanguageChanged(form, EventArgs.Empty);
}
这样就可以了


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C#進行language切換時候label大小能否跟隨語系變化?form的size為什麼會出現自動改變
喜欢 (0)
[1034331897@qq.com]
分享 (0)