• AvalonDock 2.0+Caliburn.Micro+MahApps.Metro实现Metro风格插件式系统(二)


    上次已经建立了可运行的基本框架,这篇就说说怎么把我们自定义的View自动加载并添加到AvalonDock里面,AvalonDock里有3种类型的UI部件,Document, DockableContent以及Floting类型,我主要说一下Document,DockableContent的添加,在AvalonDock里Document类型可参考VS,DockableContent相当于VS里的工具栏等,之后我直接在.cs文件里写注释以及解析。

    现在的项目结构:

    运行结果:

      

      可以看到里面多了一个测试的Document,该Document是由MEF自动加载并且绑定到AvalonDock里,这里我只写一个一个Document,有兴趣的可以自己动手试一试,目前的Document是写在主程序里面,其实这Document应该写在一个单独的DLL里面,这就是我们所谓的插件。 [BY Zengg]

    DockScreenManager类  

     DockScreenManager

    DocumentBase类

     DocumentBase

    IDockScreen接口

     IDockScreen

    IDocument接口

     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     }
    复制代码

    较第一张更改部分:

      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/

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    POJ 1182 食物链(带权并查集)
    UVa 10655 n次方之和(矩阵快速幂)
    2016湘潭邀请赛—Heartstone
    2016湘潭邀请赛—Gambling
    UVa 10375 选择与除法(唯一分解定理)
    UVa 1637 纸牌游戏(全概率公式)
    POJ 2443 Set Operation(压位加速)
    UVa 11248 网络扩容(最大流(需要优化))
    51Nod 1737 配对(树的重心)
    51Nod 1070 Bash游戏 V4(斐波那契博弈)
  • 原文地址:https://www.cnblogs.com/magic-xxj/p/10723897.html
Copyright © 2020-2023  润新知