下面是递归调用菜单栏的一段代码
private static void AppLang(ToolStripMenuItem item, System.ComponentModel.ComponentResourceManager resources)
{
if (item is ToolStripMenuItem)
{
resources.ApplyResources(item, item.Name);
ToolStripMenuItem tsmi = (ToolStripMenuItem)item;
if (tsmi.DropDownItems.Count > 0)
{
foreach (ToolStripMenuItem c in tsmi.DropDownItems)
{
AppLang(c, resources);
}
}
}
}出现一个问题,菜单栏上有一个toolStripSeparator类的分割符;但在包含在第一级菜单File文件下
在foreach (ToolStripMenuItem c in tsmi.DropDownItems)循环时
当循环到 toolStripSeparator对象时;跳出异常不能强制把toolStripSeparator类型转换为ToolStripMenuItem类型请问大家有什么方法;在foreach()循环的时候遇到toolStripSeparator时跳过,进入下一个循环我也想过,想把foreach()换成for()循环;但这个是递归调用的,循环变量参数不好控制
请大家一起指点一下
private static void AppLang(ToolStripMenuItem item, System.ComponentModel.ComponentResourceManager resources)
{
if (item is ToolStripMenuItem)
{
resources.ApplyResources(item, item.Name);
ToolStripMenuItem tsmi = (ToolStripMenuItem)item;
if (tsmi.DropDownItems.Count > 0)
{
foreach (ToolStripMenuItem c in tsmi.DropDownItems)
{
AppLang(c, resources);
}
}
}
}出现一个问题,菜单栏上有一个toolStripSeparator类的分割符;但在包含在第一级菜单File文件下
在foreach (ToolStripMenuItem c in tsmi.DropDownItems)循环时
当循环到 toolStripSeparator对象时;跳出异常不能强制把toolStripSeparator类型转换为ToolStripMenuItem类型请问大家有什么方法;在foreach()循环的时候遇到toolStripSeparator时跳过,进入下一个循环我也想过,想把foreach()换成for()循环;但这个是递归调用的,循环变量参数不好控制
请大家一起指点一下
foreach (ToolStripItem c in tsmi.DropDownItems)
{
if (c is ToolStripMenuItem)
AppLang(c, resources);
}
是在从 tsmi.DropDownItems中取对象的时候就报错了
foreach不是用ToolStripItem c 来接收tsmi.DropDownItems的赋值
在循环挑到那一步就报错了
没有执行到循环体
{
if (obj is ToolStripMenuItem)
ToolStripMenuItem c = obj as ToolStripMenuItem;
AppLang(c, resources);
}
ToolStripSeparator 也是ToolStripItem。
public class ToolStripSeparator : ToolStripItem
foreach (ToolStripItem c in tsmi.DropDownItems)
{
if(c is ToolStripMenuItem)
{
AppLang(c, resources);
}
}
就是在软件的菜单栏 中英文转换的
栏目不是很多
直接在resources中定义文件转换就可以了这段代码也是网上找来了
至于谁的 忘记了现在一起贴出来给大家看下#region Draw graph
private void drawPanel_Paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawRectangle(new Pen(new SolidBrush(Color.Red)), 100, 100, 50, 30);
using(SolidBrush brush=new SolidBrush(Color.Blue))
{
e.Graphics.FillRectangle(brush,300,50,200,80);
}
}
#endregion #region SetLang
/// <summary>
/// 设置当前程序的界面语言
/// </summary>
/// <param name="lang">language:zh-CN, en-US</param>
/// <param name="form">窗体实例</param>
/// <param name="formType">窗体类型</param>
public static void SetLang(string lang, Form form, Type formType)
{
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang);
if (form != null)
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(formType);
resources.ApplyResources(form, "$this");
AppLang(form, resources);
}
} #region AppLang for control
/// <summary>
/// 遍历窗体所有控件,针对其设置当前界面语言
/// </summary>
/// <param name="control"></param>
/// <param name="resources"></param>
private static void AppLang(Control control, System.ComponentModel.ComponentResourceManager resources)
{
if (control is MenuStrip)
{
resources.ApplyResources(control, control.Name);
MenuStrip ms = (MenuStrip)control;
if (ms.Items.Count > 0)
{
foreach (ToolStripMenuItem c in ms.Items)
{
AppLang(c, resources);
}
}
} foreach (Control c in control.Controls)
{
resources.ApplyResources(c, c.Name);
AppLang(c, resources);
}
}
#endregion #region AppLang for menuitem
/// <summary>
/// 遍历菜单
/// </summary>
/// <param name="item"></param>
/// <param name="resources"></param>
private static void AppLang(ToolStripMenuItem item, System.ComponentModel.ComponentResourceManager resources)
{
if (item is ToolStripMenuItem)
{
resources.ApplyResources(item, item.Name);
ToolStripMenuItem tsmi = (ToolStripMenuItem)item;
if (tsmi.DropDownItems.Count > 0)
{
foreach (ToolStripItem c in tsmi.DropDownItems)
{
if (c is ToolStripMenuItem)
{
//按照你的方法 直接把 分隔符ToolStripSeparator类型的过滤掉 实现语言转换
ToolStripMenuItem ts = (ToolStripMenuItem)c;
AppLang(ts, resources);
}
}
}
}
}
#endregion