返回首页

简介
我很压抑发现的CAB(复合应用程序块)不支持一个更高的水平,在其基本落实的ToolStrip。我决心解决这个问题,我添加了一个适配器和ToolStripPanel的最初的工厂,但我一直有与ToolStripContainer的麻烦。因此,作为我的第一篇文章,这里是ToolStripPanel的代码。
这有两个部分。两种方法可以做到这一点。首先是要编辑现有的ToolStrip UI工厂,包括新的代码。但我不喜欢这样做,我可能会在未来更新的CAB和不想依靠再次实施的适应化修改。
二是从目前在自己的汇编类继承和适应类,同时支持。这样,您正在扩大,而不是取代。
这里是新的ToolStripUIAdapterFactory工厂代码:

Public Class ToolStripPanelUIAdapter : _



             Inherits UIElementAdapter(Of ToolStrip)

        Private innerToolStripPanel As ToolStripPanel

        Public Sub New(ByVal objToolStripPanel As ToolStripPanel)

            Guard.ArgumentNotNull(objToolStripPanel, "objToolStripPanel")

            Me.innerToolStripPanel = objToolStripPanel

        End Sub

        Protected Overrides Function Add(ByVal uiElement As ToolStrip) _

                                                         As ToolStrip

            If Me.innerToolStripPanel Is Nothing Then

                Throw New InvalidOperationException()

            End If

            Me.innerToolStripPanel.Join(uiElement, 3)

            Return uiElement

        End Function

        Protected Overrides Sub Remove(ByVal uiElement As ToolStrip)

            If Me.innerToolStripPanel.Controls.Contains(uiElement) Then

                Me.innerToolStripPanel.Controls.Remove(uiElement)

            End If

        End Sub

End Class

正如你可以看到,它从同一个名字的CAB类继承和覆盖相同的方法,它并,并添加ToolStripPanel的新适配器的支持。
你现在可以添加工厂AfterShellCreated部分主要的外壳应用程序的UI元素适配器厂目录:{C}
的CAB框架现在适当的工厂处理UI扩展网站ToolStripPanels。现在我们需要的是适配器... ...
下面是ToolStripPanel的适配器代码:
Public Class ToolStripPanelUIAdapter : Inherits UIElementAdapter(Of ToolStrip)

    Private innerToolStripPanel As ToolStripPanel

    Public Sub New(ByVal objToolStripPanel As ToolStripPanel)

        Guard.ArgumentNotNull(objToolStripPanel, "objToolStripPanel")

        Me.innerToolStripPanel = objToolStripPanel

    End Sub

    Protected Overrides Function Add(ByVal uiElement As ToolStrip) _

                                                     As ToolStrip

        If Me.innerToolStripPanel Is Nothing Then

            Throw New InvalidOperationException()

        End If

        Me.innerToolStripPanel.Join(uiElement, 3)

        Return uiElement

    End Function

    Protected Overrides Sub Remove(ByVal uiElement As ToolStrip)

        If Me.innerToolStripPanel.Controls.Contains(uiElement) Then

            Me.innerToolStripPanel.Controls.Remove(uiElement)

        End If

    End Sub

End Class

这让你注册类型ToolStripPanel的是一个网站,提供的功能:
RootWorkItem.UIExtensionSites.RegisterSite("MainToolStripPanelSiteName", 

             Me.Shell.InnerToolStripContainer.TopToolStripPanel)

这段代码寄存器的顶部面板,但你可以注册,但只能在另一个单独的网站或全部,。一旦你已经注册的网站,你可以创建和ToolStrips添加到它:
Dim objToolStip As New System.Windows.Forms.ToolStrip

LocalWorkItem.UIExtensionSites("MainToolStripPanelSiteName").Add(objToolStip)

LocalWorkItem.UIExtensionSites.RegisterSite("MyCustomToolStripSitename", _

                                            objToolStip)

不要忘记第二次登记,允许您添加一个按钮的ToolStrip。
全部完成... ...您现在应该能够创造出动态的工具条和填充它们。如果你想自定义命令,您将需要创建一个ToolStripPanel的命令适配器,并把它添加到的CAB。

回答

评论会员:nayato 时间:2011/12/06
ERM ...你的第一个代码清单似乎是错误的 - 它重复后一个使厂源错过。你能纠正呢?
评论会员:爱德华威尔逊 时间:2011/12/06
使用System.Windows.Forms;

使用Microsoft.P​​ractices.CompositeUI.UIElements;
  ; 使用Microsoft.P​​ractices.CompositeUI.Utility;
 60; 使用Microsoft.P​​ractices.CompositeUI.WinForms.UIElements;

/ / / / / /一个生产XtraBar相关的UI元素的适配器。/ / /
公共类ToolStripPanelUIAdapterFactory:IUIElementAdapterFactory
{
/ / /
/ / /返回指定的UIElement。
/ / /
/ / / UIElement的返回
/ / /一个指定的元素
公共IUIElementAdapter GetAdapter(对象UIElement的)
{ Guard.ArgumentNotNull(UIElement的,"UIElement的");
 0; 尝试
{
&# 160; (UIElement的是ToolStripPanel的)
  ; 返回新ToolStripPanelUIAdapter(ToolStripPanel的)UIElement的;

 0; (UIElement的是ToolStrip的)
 0; 返回新ToolStripItemCollectionUIAdapter(((ToolStrip的)的UIElement)的项目。)

 60; (UIElement的是ToolStripItem的)
&# 160; 返回新ToolStripItemOwnerCollectionUIAdapter((的ToolStripItem)UIElement的);

& #160; (UIElement的是ToolStripItemCollection)
  ; 返回新ToolStripItemCollectionUIAdapter((ToolStripItemCollection)UIElement的);
}
  ; 赶上(例外)
 0; {
 60;
System.Diagnostics.Debug.WriteLine(ex.Message);  60;
抛出;   ; }

抛出ExceptionFactory.CreateInvalidAdapterElementType(uiElement.GetType()的GetType ());{ BR} }

/ / /
/ / /表示如果指定的UI元素是由适配器工厂的支持。
/ / /
/ / / UI元素,以评估
支持的元素/ / /返回true,否则返回false。
公共BOOL支持(对象UIElement的)
{
返回

 60; UIElement的是ToolStrip的| |
UIElement的是ToolStripItem的| |
UIElement的是ToolStripItemCollection | |
  ;
UIElement的是ToolStripPanel的;}

评论会员:pointnetsolutions 时间:2011/12/06
起初我还以为"WFT的是政制事务局"

然后,经过一番搜索,我发现,你似乎是指综合UI应用程序块。

我找到适当使用长格式至少一次在您的文章,特别是因为实在没有TLA(三个字母缩写词)的短缺,有很多不同的含义.:->{​​ BR}

的问候,
MAV
-
黑洞是神的地方除以0 ...
评论会员:hinshelwm 时间:2011/12/06
这也将是不错的,有你的组件的实际屏幕截图。

亚历山大Brisebois
http://www.pointnetsolutions.com