Adding controls to ToolStrip in C#

http://someuser77.com/guides/adding-controls-to-toolstrip/   Adding controls to ToolStrip in C# The ToolStrip control is capable of holding some common controls that comes with the .NET framework such as the ToolStripButton, the ToolStripComboBox and several others. What about adding a non standard control such as a CheckBox or a MonthCalendar? Using the ToolStripControlHost one can do exactly this. As it is stated in the MSDN article How to: Wrap a Windows Forms Control with ToolStripControlHost you should derive from the ToolStripControlHost class: public classToolStripCheckBox : ToolStripControlHost { public ToolStripCheckBox() : base(newCheckBox()) { } } now the CheckBox can be added to the ToolStrip using: ToolStripCheckBox toolStripCheckBox = newToolStripCheckBox(); toolStrip1.Items.Add((ToolStripItem)toolStripCheckBox); And the CheckBox properties and events can be accessed using: (toolStripCheckBox.Control asCheckBox).Text = "CheckBox"; (toolStripCheckBox.Control asCheckBox).CheckedChanged += (sender, e) => MessageBox.Show((sender asCheckBox).Checked.ToString()); To remove the casting from the user code and since C# does not supportmultiple inharitance it is suggested to incapsulate all the commonmethods and properties of CheckBox: publicCheckBox CheckBoxControl { get { return Control asCheckBox; } } publicbool Checked { get { return CheckBoxControl.Checked; } set { CheckBoxControl.Checked = value; } } so now you can write: toolStripCheckBox.CheckBoxControl.Text = "CheckBox"; toolStripCheckBox.CheckBoxControl.CheckedChanged += (sender, e) => MessageBox.Show((sender asCheckBox).Checked.ToString()); finally provide the events you wish to access directly from the ToolStripControlHost: public eventEventHandler CheckedChanged; public void OnCheckedChanged(object sender, EventArgs e) { if (CheckedChanged != null) { CheckedChanged(this, e); } } protectedoverridevoid OnSubscribeControlEvents(Control control) { base.OnSubscribeControlEvents(control); (control asCheckBox).CheckedChanged += OnCheckedChanged; } protectedoverridevoid OnUnsubscribeControlEvents(Control control) { base.OnUnsubscribeControlEvents(control); (control asCheckBox).CheckedChanged -= OnCheckedChanged; } or if you want that the CheckedChanged event will hold the CheckBox as the sender instead of the ToolStripCheckBox replace: public void OnCheckedChanged(object sender, EventArgs e) { if (CheckedChanged != null) { CheckedChanged(this, e); } } with: public void OnCheckedChanged(object sender, EventArgs e) { if (CheckedChanged != null) { CheckedChanged(sender, e); } } so now you can write: toolStripCheckBox.CheckedChanged += (sender, e) => MessageBox.Show((sender asToolStripCheckBox).Checked.ToString()); finally if you wish to add the control to the toolstrip in the designer add the ToolStripItemDesignerAvailability Attribute to the ToolStripCheckBox class: [ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.ToolStrip)] public classToolStripCheckBox : ToolStripControlHost { ... now you can select the CheckBox from the designer by right clicking the toolstrip and selecting 'Edit Items...' and even view the exposed event in the control properties: The c
原文地址:https://www.cnblogs.com/adodo1/p/4328072.html