CAB學習筆記1 - Creating a Module

    在MSDN上瀏覽Smart Client時發現了CAB(Composite UI Application Block) ,一下被它的描述吸引了,下載後掃了一遍源代碼,的確是值得好好研究一番,以後的開發中就用它了。
    今天學習了Lab 1: Introduction to Developing with the Composite UI Application Block 。感覺界面的組合佈局上和ASP.NET2.0中的WebParts有點類似(對webparts只是瞭解一點,沒用過:D).這樣在對付一些複雜界面時的確會方便許多。由於對Inversion of Control (IOC) 和 Dependency Injection 不太瞭解,所有看起來還是很費勁的。只好先照着例子試驗一下,先有個感性的認識再說。
    在這個例子中對GPSModule的調用是通過ProfileCatalog.xml的配置來實現的。我想如果用戶損壞了此配置文件怎麼辦?是不是自己做個維護配置文件小工具,可以通過可視界面來初始化、修改配置信息較好。

今天瞭解了一下內容:

1、模塊配置文件名必須是ProfileCatalog.xml嗎?
    通過跟蹤program.Run()發現在基類CabApplication的Sub Run()中調用LoadModules()時加載默認的配置文件名是在SolutionProfileReader類中定義的:

    Public Class SolutionProfileReader
        
Private innerCatalogFilePath As String = DefaultCatalogFile

        
''' <summary>
        ''' The default profile to use if no profile is specified.
        ''' </summary>
        Public Const DefaultCatalogFile As String = "ProfileCatalog.xml"

        
''' <summary>
        ''' Initializes a new instance which will use the <see cref="DefaultCatalogFile"/> as
        ''' the solution profile.
        ''' </summary>
        Public Sub New()
        
End Sub


        
''' <summary>
        ''' Initializes a new instance that will use the specified file as the solution profile.
        ''' </summary>
        ''' <param name="catalogFilePath">The path to the solution profile. This file must be
        ''' located under the application folder.</param>
        Public Sub New(ByVal catalogFilePath As String)
            
Me.innerCatalogFilePath = GetFullPathOrThrowIfInvalid(catalogFilePath)
        
End Sub


'其他...

End Class

此類的重載構造函數Sub New(ByVal catalogFilePath As String)說明還是可以修改配置文件名的。

 2、服務的兩種加載類型
a)在CabApplication的Sub LoadModules()調用時自動加載到內存中。
b) 在服務被首次調用時才加載。
    需要在服務類增加屬性並指定AddOnDemand爲True , 比如:

    ' This is a service that won't be created until needed.
    <Service(GetType(IDistanceCalculatorservice), AddOnDemand:=True)> _
    
Public Class DistanceCalculatorservice
        
Implements IDistanceCalculatorservice

        
Public Function ComputeDistance(ByVal latitude As IntegerByVal longitude As IntegerAs Integer Implements IDistanceCalculatorservice.ComputeDistance
            
Return 1234
        
End Function

    
End Class

3、GPSWorkItem中顯示GPSView的WorkSpace控件名稱必須和主界面中DeckWorkspace控件的Name一致,是否可以通過配置取消這種硬編碼上的依賴?

    Public Class GPSWorkItem
        
Inherits WorkItem

        
Protected Overrides Sub OnRunStarted()
            
MyBase.OnRunStarted()

            
'“MainWorkspace”爲主窗體中DeckWorkspace的Name
            Dim GPSWorkspace As IWorkspace = Workspaces("MainWorkspace")
            GPSWorkspace.Show(Items.AddNew(
Of GPSView)())
        
End Sub

    
End Class

4、可以把一個Form顯示到WorkSpace中嗎?
可以的,但是需要在Form的構造函數中設置窗體的TopLevel=False 。

Public Class Form1

    
Public Sub New()

        
' 此調用是 Windows 窗體設計器所必需的。
        InitializeComponent()

        
' 在 InitializeComponent() 調用之後添加任何初始化。

        
'必須將TopLevel設置成False才能將此窗體添加到WorkSpace中
        Me.TopLevel = False

        
Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None

        
Me.Dock = Windows.Forms.DockStyle.Fill

    
End Sub


End Class


   
Public Class GPSWorkItem
        
Inherits WorkItem

        
Protected Overrides Sub OnRunStarted()
            
MyBase.OnRunStarted()

            
'“MainWorkspace”爲主窗體中DeckWorkspace的Name
            Dim GPSWorkspace As IWorkspace = Workspaces("MainWorkspace")
            GPSWorkspace.Show(Items.AddNew(
Of Form1)())
        
End Sub

    
End Class

時間不早了,天亮了還要出差去奉賢,過去又不能上網咯,等下週回來了再研究吧!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章