Hi there!
I have been working on the issue for a while, and the two most widely held ideas I got are:
1) Exposing the ToolStrip as a property.
2) Use a ControlDesigner for the UserControl and set EnableDesignMode for the ToolStrip.
But somehow none of them actually served my purpose, as exposing the ToolStrip would let the user have full control on it, which was not my objective. The second option would even put the user up with deleting the ToolStrip. Hence I had to figure out a different approach. That's when I tripped upon the CollectionBase class.
As it says, the CollectionBase class is the abstract base class for a strongly typed collection. So how about maintaining the ToolStrip item collection through it?
I created an instance of the CollectionBase class and regulated the addition, modification, fetching and deletion of the ToolStrip items through it. Each item in the collection hails from a class that is inherited from the ToolStripButton class. In that way, individual item can be handled as any standard ToolStripButton and you can hide or show the properties to the user accordingly. Lastly, the ToolStrip in question is set as the parent of the CollectionBase which eventually becomes the parent of each ToolStripItem too. Here's the concept:
Imports System.ComponentModel
Imports System.Windows.Forms
Imports Office2003
Imports System.Drawing
Imports System.Windows.Forms.Design
Public Class MyUserControl
Private _Buttons As MyUserControlButtons
Public Event MyUserControlButtonClicked(ByVal Sender As MyUserControlButton)
Public Sub New()
MyBase.New()
InitializeComponent()
_Buttons = New MyUserControlButtons(MyToolStrip)
End Sub
<designerserializationvisibility(designerserializationvisibility.content)> _
Public ReadOnly Property Buttons As MyUserControlButtons
Get
Return _Buttons
End Get
End Property
Private Sub MyToolStrip_ItemClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs) Handles MyToolStrip.ItemClicked
If TypeOf e.ClickedItem Is ToolStripButton Then
RaiseEvent MyUserControlButtonClicked(Item)
End If
End Sub
End Class
#Region "Manager classes for MyUserControl buttons."
Public Class MyUserControlButtons
Inherits CollectionBase
Private _Parent As ToolStrip
Public Sub New(ByVal Holder As ToolStrip)
MyBase.New()
_Parent = Holder
End Sub
Public ReadOnly Property Parent() As ToolStrip
Get
Return _Parent
End Get
End Property
Default Public ReadOnly Property Item(ByVal Index As Integer) As MyUserControlButton
Get
Return CType(List(Index), MyUserControlButton)
End Get
End Property
Public Function Add() As MyUserControlButton
Return Me.Add
End Function
Public Sub Add(ByVal Value As MyUserControlButton)
List.Add(Value)
Value.Parent = Me.Parent
End Sub
Public Function Add(ByVal Name As String, ByVal Image As Image) As MyUserControlButton
Dim b As MyUserControlButton = New MyUserControlButton(Me.Parent)
b.Name = Name
b.Text = Name
b.Image = Image
Me.Add(b)
Return b
End Function
Public Function Add(ByVal Name As String, ByVal Text As String, ByVal Image As Image) As MyUserControlButton
Dim b As MyUserControlButton = New MyUserControlButton(Me.Parent)
b.Name = Name
b.Text = Text
b.Image = Image
Me.Add(b)
Return b
End Function
Public Sub Remove(ByVal Value As MyUserControlButton)
List.Remove(Value)
End Sub
Public Function IndexOf(ByVal Value As Object) As Integer
Return List.IndexOf(Value)
End Function
Public Function Contains(ByVal Value As MyUserControlButton) As Boolean
Return List.Contains(Value)
End Function
Protected Overrides Sub OnInsertComplete(ByVal index As Integer, ByVal value As Object)
Dim b As MyUserControlButton = CType(value, MyUserControlButton)
b.Parent = Me.Parent
Me.Parent.Items.Insert(index, CType(value, ToolStripButton))
MyBase.OnInsertComplete(index, value)
End Sub
Protected Overrides Sub OnSetComplete(ByVal index As Integer, ByVal oldValue As Object, ByVal newValue As Object)
Dim b As MyUserControlButton = CType(newValue, MyUserControlButton)
b.Parent = Me.Parent
MyBase.OnSetComplete(index, oldValue, newValue)
End Sub
Protected Overrides Sub OnClearComplete()
MyBase.OnClearComplete()
End Sub
End Class
Public Class MyUserControlButton
Inherits ToolStripButton
Sub New()
MyBase.New()
Init()
End Sub
Sub New(ByVal Holder As ToolStrip)
MyBase.New()
Init()
Me.Parent = Holder
End Sub
Private Sub Init()
Me.AutoToolTip = False
Me.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText
Me.ImageAlign = ContentAlignment.MiddleLeft
Me.ImageIndex = -1
Me.ImageKey = ""
Me.ImageTransparentColor = Color.Magenta
Me.TextAlign = ContentAlignment.MiddleLeft
Me.TextDirection = ToolStripTextDirection.Horizontal
End Sub
<browsable(false),>
EditorBrowsable(False)> _
Public Shadows Property AccessibleDefaultActionDescription As String
Get
Return MyBase.AccessibleDefaultActionDescription
End Get
Set(ByVal value As String)
MyBase.AccessibleDefaultActionDescription = value
End Set
End Property
<browsable(false),>
EditorBrowsable(False)> _
Public Shadows Property AccessibleDescription As String
Get
Return MyBase.AccessibleDescription
End Get
Set(ByVal value As String)
MyBase.AccessibleDescription = value
End Set
End Property
<browsable(false),>
EditorBrowsable(False)> _
Public Shadows Property AccessibleName As String
Get
Return MyBase.AccessibleName
End Get
Set(ByVal value As String)
MyBase.AccessibleName = value
End Set
End Property
<defaultvalue(false)> _
Public Shadows Property AutoToolTip As Boolean
Get
Return MyBase.AutoToolTip
End Get
Set(ByVal value As Boolean)
MyBase.AutoToolTip = value
End Set
End Property
<defaultvalue(gettype(toolstripitemdisplaystyle),> _
Public Overrides Property DisplayStyle As System.Windows.Forms.ToolStripItemDisplayStyle
Get
Return MyBase.DisplayStyle
End Get
Set(ByVal value As System.Windows.Forms.ToolStripItemDisplayStyle)
MyBase.DisplayStyle = value
End Set
End Property
Public Overrides Property Image() As Image
Get
Return MyBase.Image
End Get
Set(ByVal value As Image)
MyBase.Image = value
End Set
End Property
<defaultvalue(gettype(contentalignment),> _
Public Shadows Property ImageAlign As ContentAlignment
Get
Return MyBase.ImageAlign
End Get
Set(ByVal value As ContentAlignment)
MyBase.ImageAlign = value
End Set
End Property
<editorbrowsable(false),>
DefaultValue(-1)> _
Public Shadows Property ImageIndex As Integer
Get
Return MyBase.ImageIndex
End Get
Set(ByVal value As Integer)
MyBase.ImageIndex = value
End Set
End Property
<editorbrowsable(false),>
DefaultValue("")> _
Public Shadows Property ImageKey As String
Get
Return MyBase.ImageKey
End Get
Set(ByVal value As String)
MyBase.ImageKey = value
End Set
End Property
Public Shadows Property ImageTransparentColor As Color
Get
Return MyBase.ImageTransparentColor
End Get
Set(ByVal value As Color)
MyBase.ImageTransparentColor = value
End Set
End Property
Public Shadows Property Name() As String
Get
Return MyBase.Name
End Get
Set(ByVal value As String)
MyBase.Name = value
End Set
End Property
<browsable(false)> _
Public Shadows Property Parent As ToolStrip
Get
Return MyBase.Parent
End Get
Set(ByVal value As ToolStrip)
MyBase.Parent = value
End Set
End Property
Public Overrides Property Text() As String
Get
Return MyBase.Text
End Get
Set(ByVal value As String)
MyBase.Text = value
End Set
End Property
<defaultvalue(gettype(contentalignment),> _
Public Overrides Property TextAlign As ContentAlignment
Get
Return MyBase.TextAlign
End Get
Set(ByVal value As ContentAlignment)
MyBase.TextAlign = value
End Set
End Property
<browsable(false),>
EditorBrowsable(False),
DefaultValue(GetType(ToolStripTextDirection), "Horizontal")> _
Public Overrides Property TextDirection As ToolStripTextDirection
Get
Return MyBase.TextDirection
End Get
Set(ByVal value As ToolStripTextDirection)
MyBase.TextDirection = value
End Set
End Property
End Class
#End Region
MyUserControl is the custom user control containing the ToolStrip named MyToolStrip. MyUserControlButtons is the class that inherits from CollectionBase and each item of MyUserControlButtons is an object of MyUserControlButton class that inherits from ToolStripButton.
In the constructor of MyUserControl, MyUserControlButtons is instantiated with MyToolStrip as its parent. Items are added to MyUserControlButtons by creating new objects from MyUserControlButton. Properties of the items to be hidden or shown are managed in MyUserControlButton.
MyUserControl returns the list of the buttons through the read only property 'Buttons'. Note the DesignerSerializationVisibility attribute of the 'Buttons' property. It specifies the type of persistence to use when serializing a property on a component at design time. The 'Content' enumeration member tells the code generator to produce code for the contents of the object, rather than for the object itself.
The drawback in this approach is that you cannot retain the items of the ToolStrip while performing copy-paste on the UserControl. It serializes the contents only when items are handled explicitly by the user but not during copy-paste. Any idea of how to deal with it is highly appreciated.
Thanks to all posters. Though I applied my own concept, your ideas paved my way.