111,126
社区成员
发帖
与我相关
我的任务
分享
public partial class MainForm : Form
{
private readonly MenuCheckStateManager manager;
public MainForm()
{
InitializeComponent();
// Create menus
ToolStripMenuItem redMenu = new ToolStripMenuItem("Red", null, OnMenuClick);
ToolStripMenuItem greenMenu = new ToolStripMenuItem("Green", null, OnMenuClick);
ToolStripMenuItem blueMenu = new ToolStripMenuItem("Blue", null, OnMenuClick);
ToolStripMenuItem colorMenu = new ToolStripMenuItem("Colors", null, redMenu, greenMenu, blueMenu);
MenuStrip menuBar = new MenuStrip();
menuBar.Items.Add(colorMenu);
this.Controls.Add(menuBar);
// Register checkable menus with MenuCheckStateManager
this.manager = new MenuCheckStateManager(new ToolStripMenuItem[] { redMenu, greenMenu, blueMenu });
}
protected override void DestroyHandle()
{
base.DestroyHandle();
// Clear the hold menus, so the menus can be garbage collected
this.manager.Dispose();
}
private void OnMenuClick(object sender, EventArgs e)
{
// change menu check state on click
ToolStripMenuItem menu = (ToolStripMenuItem)sender;
this.manager.Change(menu);
}
}
// Check state manager
public class MenuCheckStateManager : IDisposable
{
private IEnumerable<ToolStripMenuItem> menus;
public MenuCheckStateManager(IEnumerable<ToolStripMenuItem> menus)
{
if (menus == null) throw new ArgumentNullException("menus");
this.menus = menus;
}
public void Change(ToolStripMenuItem menuToCheck)
{
if (menuToCheck == null) throw new ArgumentNullException("menuToCheck");
foreach (ToolStripMenuItem menu in this.menus)
{
menu.Checked = menu == menuToCheck;
}
}
// Implement IDisposable interface.
// You can google on the Internet for more information about how to implement IDisposable interface.
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
lock (this)
{
this.menus = null;
}
}
}
~MenuCheckStateManager()
{
Dispose(false);
}
}
public partial class MainForm : Form
{
private readonly MenuCheckStateManager manager;
public MainForm()
{
InitializeComponent();
ToolStripMenuItem redMenu = new ToolStripMenuItem("Red", null, OnMenuClick);
ToolStripMenuItem greenMenu = new ToolStripMenuItem("Green", null, OnMenuClick);
ToolStripMenuItem blueMenu = new ToolStripMenuItem("Blue", null, OnMenuClick);
ToolStripMenuItem colorMenu = new ToolStripMenuItem("Colors", null, redMenu, greenMenu, blueMenu);
MenuStrip menuBar = new MenuStrip();
menuBar.Items.Add(colorMenu);
this.Controls.Add(menuBar);
this.manager = new MenuCheckStateManager(new ToolStripMenuItem[] { redMenu, greenMenu, blueMenu });
}
protected override void DestroyHandle()
{
base.DestroyHandle();
this.manager.Dispose();
}
private void OnMenuClick(object sender, EventArgs e)
{
ToolStripMenuItem menu = (ToolStripMenuItem)sender;
this.manager.Change(menu);
}
}
public class MenuCheckStateManager : IDisposable
{
private IEnumerable<ToolStripMenuItem> menus;
public MenuCheckStateManager(IEnumerable<ToolStripMenuItem> menus)
{
if (menus == null) throw new ArgumentNullException("menus");
this.menus = menus;
}
public void Change(ToolStripMenuItem menuToCheck)
{
if (menuToCheck == null) throw new ArgumentNullException("menuToCheck");
foreach (var menu in this.menus.Where(m => !m.Equals(menuToCheck)))
{
menu.Checked = false;
}
menuToCheck.Checked = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
lock (this)
{
this.menus = null;
}
}
}
~MenuCheckStateManager()
{
Dispose(false);
}
}