您的位置:首页 > 编程语言 > C#

Adding controls to ToolStrip in C#

2012-07-16 20:36 344 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: