查找 Windows 表单中的所有 ContextMenuStrip
Find all ContextMenuStrips in Windows Form
如何在 Windows 表单中循环遍历所有上下文菜单?
我目前拥有的是:
public void SearchContextMenuStrip(Form Window)
{
foreach (Control item in Window.Controls)
{
if (item is ContextMenuStrip)
{
MessageBox.Show("ContextMenuStrip found!", "ContextMenuStrip found");
}
else
{
}
}
}
这适用于所有其他控件,但不适用于 ContextMenus。
我希望它能够翻译多语言应用程序的所有文本,所以如果有人知道更好的解决方案,我将不胜感激。
提前致谢!
您可以将 仅关联一个 ContextMenuStrip
到每个控件 所以我认为您需要 ToolStripMenuItem
foreach( var item in Window.ContextMenuStrip.Items)
{
}
使用 resx 文件并为每种区域语言创建带有翻译的文件。使用 settings.NAME 而不是硬编码。将自动应用本地化。
https://msdn.microsoft.com/en-us/library/aa992030(v=vs.100).aspx
我认为最好的解决方案是使用反射并在所有对象之间找到 ContextMenuStrip。此脚本将能够 return 所有 ContextMenuStrip。
public static bool IsLastObject(object obj)
{
if (obj == null) return true;
Type type = obj.GetType();
return
type.IsArray ||
type.IsEnum ||
type.IsPointer ||
type.IsAbstract ||
type.IsSealed;
}
public static IEnumerable<Control> GetAllControls(object obj, int maxNests = 25)
{
if (obj == null || maxNests < 0) yield break;
Type type = obj.GetType();
List<Control> list = new List<Control>();
if (obj is Control)
foreach (Control item in ((Control)obj).Controls)
{
list.Add(item);
yield return item;
}
foreach (var item in type.GetFields())
{
var nobj = item.GetValue(obj);
if (nobj == null) continue;
if (nobj is Control && !list.Contains((Control)nobj)) yield return (Control)nobj;
if (IsLastObject(nobj)) continue;
foreach (var ni in GetAllControls(nobj, maxNests - 1))
yield return ni;
}
}
public static IEnumerable<ContextMenuStrip> GetAllToolStrips(object control, int maxNests = 25)
{
foreach (var item in GetAllControls(control, maxNests))
if (item is ContextMenuStrip) yield return (ContextMenuStrip)item;
}
享受...
如何在 Windows 表单中循环遍历所有上下文菜单?
我目前拥有的是:
public void SearchContextMenuStrip(Form Window)
{
foreach (Control item in Window.Controls)
{
if (item is ContextMenuStrip)
{
MessageBox.Show("ContextMenuStrip found!", "ContextMenuStrip found");
}
else
{
}
}
}
这适用于所有其他控件,但不适用于 ContextMenus。
我希望它能够翻译多语言应用程序的所有文本,所以如果有人知道更好的解决方案,我将不胜感激。
提前致谢!
您可以将 仅关联一个 ContextMenuStrip
到每个控件 所以我认为您需要 ToolStripMenuItem
foreach( var item in Window.ContextMenuStrip.Items)
{
}
使用 resx 文件并为每种区域语言创建带有翻译的文件。使用 settings.NAME 而不是硬编码。将自动应用本地化。
https://msdn.microsoft.com/en-us/library/aa992030(v=vs.100).aspx
我认为最好的解决方案是使用反射并在所有对象之间找到 ContextMenuStrip。此脚本将能够 return 所有 ContextMenuStrip。
public static bool IsLastObject(object obj)
{
if (obj == null) return true;
Type type = obj.GetType();
return
type.IsArray ||
type.IsEnum ||
type.IsPointer ||
type.IsAbstract ||
type.IsSealed;
}
public static IEnumerable<Control> GetAllControls(object obj, int maxNests = 25)
{
if (obj == null || maxNests < 0) yield break;
Type type = obj.GetType();
List<Control> list = new List<Control>();
if (obj is Control)
foreach (Control item in ((Control)obj).Controls)
{
list.Add(item);
yield return item;
}
foreach (var item in type.GetFields())
{
var nobj = item.GetValue(obj);
if (nobj == null) continue;
if (nobj is Control && !list.Contains((Control)nobj)) yield return (Control)nobj;
if (IsLastObject(nobj)) continue;
foreach (var ni in GetAllControls(nobj, maxNests - 1))
yield return ni;
}
}
public static IEnumerable<ContextMenuStrip> GetAllToolStrips(object control, int maxNests = 25)
{
foreach (var item in GetAllControls(control, maxNests))
if (item is ContextMenuStrip) yield return (ContextMenuStrip)item;
}
享受...