谁有最优化的动态菜单程序?

cengyidao 2007-01-30 05:04:11
如题所述,我们经常用到动态菜单,不过或多或少都遇到一些问题和缺陷,谁有比较解决比较完善的代码或思路,可以贴上来让大家学习学习!
谢谢支持!
...全文
177 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuanzhihua520 2007-04-18
  • 打赏
  • 举报
回复
up
flyaqiao 2007-02-05
  • 打赏
  • 举报
回复
public ContextMenuStrip MainMenu = null;
public void CreateMainMenu(IList menuItems)
{
if (MainMenu == null)
{
MainMenu = new ContextMenuStrip();
foreach (object item in menuItems)
{
ToolStripMenuItem mi = null;

mi = new ToolStripMenuItem((string)GetValue(item, "Caption"));
mi.Name = GetValue(item, "Id").ToString();
//mi.ShortcutKeys = (Keys)item["ShortCut"];
mi.Tag = item;
mi.Click += new EventHandler(MenuClick);
string iconFile = (string)GetValue(item, "Icon");
if (System.IO.File.Exists(iconFile))
{
mi.Image = Image.FromFile(iconFile);
}
Guid fatherId = (Guid)GetValue(item, "FatherId");
bool separater = (bool)GetValue(item, "Separater");
if (fatherId == Guid.Empty)
{
if (separater)
MainMenu.Items.Add("-");
MainMenu.Items.Add(mi);
}
else
AddChildMenu(fatherId.ToString(), mi, MainMenu.Items, separater);
}
}
MainMenu.Items.Add("-");
Assembly a = Assembly.GetExecutingAssembly();
System.Drawing.Image img = Image.FromStream(a.GetManifestResourceStream(a.GetName().Name + ".Images.help.ico"));
MainMenu.Items.Add("帮助与支持", img, MenuHelp);
if (ApplicationDeployment.IsNetworkDeployed)
MainMenu.Items.Add("检查更新", null, MenuCheckUpdate);
MainMenu.Items.Add("关于...", null, MenuAbout);
MainMenu.Items.Add("-");
m_MinMenu = new ToolStripMenuItem("最小化", null, MenuMin);
MainMenu.Items.Add(m_MinMenu);
if (MainForm.WindowState == FormWindowState.Normal)
m_MaxMenu = new ToolStripMenuItem("最大化", null, MenuMax);
else
m_MaxMenu = new ToolStripMenuItem("还原", null, MenuMax);
MainMenu.Items.Add(m_MaxMenu);
MainMenu.Items.Add("-");
MainMenu.Items.Add("退出系统", null, MenuExit);
MainMenu.Show(1500, 1500);
}
private object GetValue(object obj, string propertyName)
{
System.Reflection.PropertyInfo pi = obj.GetType().GetProperty(propertyName);
if (null != pi)
return pi.GetValue(obj, null);
return null;
}
private bool AddChildMenu(string key, ToolStripMenuItem item, ToolStripItemCollection items, bool hasSeparator)
{
if (items == null)
return false;
ToolStripMenuItem pmi = items[key] as ToolStripMenuItem;

if (pmi == null)
{
foreach (ToolStripItem mi in items)
{
if (mi is ToolStripSeparator) continue; // skip the separator line
if ((pmi = ((mi as ToolStripMenuItem).DropDownItems[key] as ToolStripMenuItem)) != null)
break;
}
}
if (pmi != null)
{
if (hasSeparator)
pmi.DropDownItems.Add("-");
pmi.DropDownItems.Add(item);
pmi.Click -= new EventHandler(MenuClick);
return true;
}
else
foreach (ToolStripItem mi in items)
{
if (mi is ToolStripSeparator) continue; // skip the separator line
if (AddChildMenu(key, item, (mi as ToolStripMenuItem).DropDownItems, hasSeparator))
return true;
}
return false;
}
#region Menu Event
public void MenuClick(object sender, EventArgs e)
{
object menu = null;
if (sender is ToolStripItem)
menu = (sender as ToolStripItem).Tag;
else if (sender is ListViewItem)
menu = (sender as ListViewItem).Tag;
if (menu != null)
KiteModule.Instance.RunModule((string)GetValue(menu, "ModuleName"), (string)GetValue(menu, "TypeName"));
}
private void MenuHelp(object sender, EventArgs e)
{
if (ShowHelp != null)
ShowHelp(sender, EventArgs.Empty);
}
private void MenuAbout(object sender, EventArgs e)
{
if (ShowAbout != null)
ShowAbout(sender, EventArgs.Empty);
}
private void MenuExit(object sender, EventArgs e)
{
Application.Exit();
}
private void MenuCheckUpdate(object sender, EventArgs e)
{
KiteSoft.Utils.Update.CheckUpdate();
}
private void MenuMin(object sender, EventArgs e)
{
//foreach (BaseForm frm in BaseForm.FormList)
// frm.WindowState = FormWindowState.Minimized;
MainForm.WindowState = FormWindowState.Minimized;
}
private void MenuMax(object sender, EventArgs e)
{
//foreach (BaseForm frm in BaseForm.FormList)
// frm.WindowState = FormWindowState.Minimized;
if (MainForm.WindowState == FormWindowState.Normal)
{
MainForm.WindowState = FormWindowState.Maximized;
m_MaxMenu.Text = "还原";
}
else
{
MainForm.WindowState = FormWindowState.Normal;
m_MaxMenu.Text = "最大化";
}
}
#endregion
cengyidao 2007-02-05
  • 打赏
  • 举报
回复
??
cengyidao 2007-02-05
  • 打赏
  • 举报
回复
thanks , it's very good !

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧