AvalonDock 2.0+Caliburn.Micro+MahApps.Metro實現Metro風格插件式系統(二)

上次已經創建了可運行的基本框架,這篇就說說怎麼把咱們自定義的View自動加載並添加到AvalonDock裏面,AvalonDock裏有3種類型的UI部件,Document, DockableContent以及Floting類型,我主要說一下Document,DockableContent的添加,在AvalonDock裏Document類型可參考VS,DockableContent至關於VS裏的工具欄等,以後我直接在.cs文件裏寫註釋以及解析。html

如今的項目結構:app

運行結果:框架

  

  能夠看到裏面多了一個測試的Document,該Document是由MEF自動加載而且綁定到AvalonDock裏,這裏我只寫一個一個Document,有興趣的能夠本身動手試一試,目前的Document是寫在主程序裏面,其實這Document應該寫在一個單獨的DLL裏面,這就是咱們所謂的插件。 [BY Zengg]ide

DockScreenManager類  工具

  DockScreenManager

DocumentBase類測試

  DocumentBase

IDockScreen接口this

  IDockScreen

IDocument接口spa

  IDocument

PanesStyleSelector類插件

複製代碼
 1  /// <summary>
 2     /// 這個很重要,這是爲使AvalonDock能區別Document和DockableContent類型並返回不一樣的style,兩個類型不一樣style有不一樣的綁定屬性
 3     /// 因此要區分開來
 4     /// </summary>
 5     public class PanesStyleSelector : StyleSelector
 6     {
 7         public Style ToolStyle
 8         {
 9             get;
10             set;
11         }
12 
13         public Style DocumentStyle
14         {
15             get;
16             set;
17         }
18         /// <summary>
19         /// 區別邏輯在這裏寫
20         /// </summary>
21         /// <param name="item">實現了IDocument或IDockableContent接口的實例</param>
22         /// <param name="container"></param>
23         /// <returns></returns>
24         public override Style SelectStyle(object item, DependencyObject container)
25         {
26             IDockScreen obj = (IDockScreen)item;
27             
28             if (item != null)
29             {
30                 //斷定爲何類型
31                 if (item is IDocument)
32                 {
33                     return DocumentStyle;
34                 }
35                 else
36                 {
37                     return ToolStyle;
38                 }
39             }
40          
41             return base.SelectStyle(item, container);
42         }
43     }
複製代碼

較第一張更改部分:code

  DockViewModel類

複製代碼
 1 namespace DemoApplication.Views
 2 {
 3     /// <summary>
 4     /// 字符串"DockViewModel"是爲了標記惟一性,在ShellViewModel裏導入時也要指定爲"DockViewModel",這至關於一個key
 5     /// </summary>
 6     [Export("DockViewModel", typeof(IDockScreenManager))]
 7     public class DockViewModel : DockScreenManager
 8     {
 9         public DockViewModel()
10             : base()
11         {
12 
13         }
14     }
15 }
複製代碼

ShellViewModel類

複製代碼
 1 namespace DemoApplication
 2 {
 3     [Export(typeof(IShell))]
 4     class ShellViewModel : IShell
 5     {
 6         readonly IWindowManager windowManager;
 7         [ImportingConstructor]
 8         public ShellViewModel(IWindowManager windowManager)
 9         {
10             this.windowManager = windowManager;
11 
12         }
13         /// <summary>
14         /// DockView
15         /// </summary>
16         [Import("DockViewModel")]
17         public IDockScreenManager DockContent { get; set; }
18     }
19 }
複製代碼

MefBootstrapper類

  MefBootstrapper

AvalonDock還支持其餘幾種皮膚,能夠知足大衆的需求:

AeroTheme

 ExpressionLightTheme

ExpressionDarkTheme

VS2010Theme

   DockableContent類型的實現和Document實現是同樣的,只是實現的接口不一樣,DockableContent實現的是IDockableContent接口,具體請參考Document實現,有疑問的能夠提出來,儘可能幫助解決,解釋寫得略簡單很差意思,可是有源碼參考,若是源碼對你們有幫助的話,求個推薦,回覆或粉的神馬的都好。。。

源碼地址:

http://pan.baidu.com/share/link?shareid=819683340&uk=554439928

 

 

若是您看了本篇博客,以爲對您有所收穫,請點擊右下角的 [推薦]

若是您想轉載本博客,請註明出處

若是您對本文有意見或者建議,歡迎留言

感謝您的閱讀,請關注個人後續博客

做者:Zengg 出處:http://www.cnblogs.com/01codeworld/

本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。

相關文章
相關標籤/搜索