基于WPF系统框架设计(5)-Ribbon整合Avalondock 2.0实现多文档界面设计(二)

摘要:
Name=“dockManager”Grid.Row=“1”>LayoutPanelOrientation=“Vertical”>LayoutDocumentContentId=“Document1”Title=“Query User”&gt:LayoutDocumentContentId=“Documen2”Title=”Add User“&gt:

AvalonDock 是一个.NET库,用于在停靠模式布局(docking)中排列一系列WPF/WinForm控件。最新发布的版本原生支持MVVM框架、Aero Snap特效并具有更好的性能。

AvalonDock 2.0版本已经发布了,新版本是用MVVM框架重新编写,似乎也用了Command(命令)模式。2.0版的文档尚未发布,但你可以参考Avalon.TestApp 或者2.0版源码中的Avalon.MVVMTestApp文件夹来查看新的API。

前一篇博文有介绍关于AvalonDock使用-《Docking For WPF–AvalonDock

还有一篇也是同类的关于多文档界面设计《基于WPF系统框架设计-Ribbon整合Avalondock 2.0实现多文档界面设计(一)》

单文档界面样式是Windows应用程序比较常用的布局选项。Microsoft Windows中的“记事本”是单文档界面应用程序的一个典型示例。在“记事本”中,同一时间只能打开一个文档。资源管理器样式界面是包含两个“窗格”或区域的单个窗口,通常由左侧的树或分层视图以及右侧的显示区域组成,与“Microsoft Windows资源管理器”一样。资源管理器样式界面适合于定位或浏览大量的文档、图片或文件。

多文档界面是从Windows 2.0下的Microsoft Excel电子表格程序开始引入的,由于Excel电子表格用户有时需要同时操作多份表格。

基于多文档,多任务模式操作的灵活性,Ribbon框架设计中也整合多文档界面布局功能,下面就来实施做一个案例。

image

  • 主要布局框架:
    1. Xceed.Wpf.AvalonDock.dll
  • 其他的是主题样式模板:
    1. Xceed.Wpf.AvalonDock.Themes.Expression.dll
    2. Xceed.Wpf.AvalonDock.Themes.Metro.dll
    3. Xceed.Wpf.AvalonDock.Themes.VS2010.dll
  • 添加引用

把这些程序集添加到项目引用中,如下图:

image

  • XAML中添加Dock标签

以XAML模式打开MainWindow.xaml,添加Dock标签,如下:

<ad:DockingManager x:Name="dockManager" Grid.Row="1">
            <ad:DockingManager.Theme>
                <themes:ExpressionBlueTheme/><!--主题样式,跟Ribbon主题一致-->
            </ad:DockingManager.Theme>
            <xcad:LayoutRoot>
                <xcad:LayoutPanel Orientation="Vertical">
                    <xcad:LayoutDocumentPaneGroup>
                        <xcad:LayoutDocumentPane>
                            <xcad:LayoutDocument ContentId="Document1" Title="查询用户">
                                
                            </xcad:LayoutDocument>
                            <xcad:LayoutDocument ContentId="Documen2" Title="添加用户">

                            </xcad:LayoutDocument>
                            <xcad:LayoutDocument ContentId="Documen3" Title="更新用户">

                            </xcad:LayoutDocument>
                        </xcad:LayoutDocumentPane>
                    </xcad:LayoutDocumentPaneGroup>
                </xcad:LayoutPanel>

            </xcad:LayoutRoot>
               <!--<xcad:LayoutRoot>
                 <xcad:LayoutPanel Orientation="Vertical">
                    <xcad:LayoutDocumentPane/>
                    <xcad:LayoutAnchorablePane Name="ToolsPane" DockHeight="150">
                    </xcad:LayoutAnchorablePane>
                </xcad:LayoutPanel>
            </xcad:LayoutRoot>-->
        </ad:DockingManager>
  • 运行程序后效果

同样这个布局控件也有主题,我针对Ribbon框架设计了三个Dock主题Silver,Blue,Black

如下图:

Silver:

image

Blue:

image

Black:

image

  • 如何做到支持动态加载Dock主题呢?

添加如下代码即可以实现动态更改Dock主题:

public static void ChangeTheme(DockingManager dockingManager, ThemeStyle themeStyle)
 {
            #region 设置控件背景的样式
            Xceed.Wpf.AvalonDock.Themes.Theme theme = null;
            switch (themeStyle)
            {
                case ThemeStyle.Blue: theme = new ExpressionBlueTheme(); break;
                case ThemeStyle.Black: theme = new ExpressionDarkTheme(); break;
                case ThemeStyle.Silver: theme = new ExpressionSilverTheme(); break;
                default: theme=new ExpressionBlueTheme(); break;
            }
            dockingManager.Theme = theme;
            #endregion
}
  • 如何做到动态加载文档界面呢?

现在的效果只是在XAML中固定的多文档界面,但是实际的系统是要支持动态创建文档的,比如我点“查询用户”就会显示这个文档内容,

我把上面改成动态生成文档的标签,参考如下源码:

<ad:DockingManager x:Name="dockManager" Grid.Row="1">
            <ad:DockingManager.Theme>
                <ad:ExpressionBlueTheme/>
            </ad:DockingManager.Theme>
            <ad:LayoutRoot>
                <ad:LayoutPanel Orientation="Vertical">
                    <ad:LayoutDocumentPane/>
                    <ad:LayoutAnchorablePane Name="ToolsPane" DockHeight="150">
                    </ad:LayoutAnchorablePane>
                </ad:LayoutPanel>
            </ad:LayoutRoot>
        </ad:DockingManager>

         运行后如下图:    

image

现在只是一个空的框架,还没有添加文档界面喔,下面就来实现动态加载文档页面。

后台代码,我实现了动态创建三个文档:

private void BtnAddUser_Click(object sender, RoutedEventArgs e)
        {
            Fluent.Button button = (Fluent.Button) sender;
            CreateFunctionTab(button.Header.ToString());
        }

        private void CreateFunctionTab(string tabName)
        {
            var firstDocumentPane = dockManager.Layout.Descendents().OfType<LayoutDocumentPane>().FirstOrDefault();
            if (firstDocumentPane != null)
            {

                LayoutDocument doc2 = new LayoutDocument();
                doc2.Title = tabName;
                doc2.IsActive = true;
                firstDocumentPane.Children.Add(doc2);

            }
        }

        private void BtnModifyUser_Click(object sender, RoutedEventArgs e)
        {
            Fluent.Button button = (Fluent.Button)sender;
            CreateFunctionTab(button.Header.ToString());
        }

        private void BtnQueryUser_Click(object sender, RoutedEventArgs e)
        {
            Fluent.Button button = (Fluent.Button)sender;
            CreateFunctionTab(button.Header.ToString());
        }

image

          现在能够动态加载文档了,就几行代码就能搞定,可是,文档也是空的哟,怎么办?

实例源码

          附:我想到下一篇博文介绍这一块的设计,我向来喜欢短小精悍文章。

免责声明:文章转载自《基于WPF系统框架设计(5)-Ribbon整合Avalondock 2.0实现多文档界面设计(二)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇解读SQL 内存数据库的细节Qt 手动添加ui文件到工程(转)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

一些值得收藏的开源框架

阅读本文大概需要 7.2 分钟。 来源:segmentfault.com/a/1190000017346799 1. 分布式应用服务开发的一站式解决方案 Spring Cloud Alibaba Spring Cloud Alibaba 致力于提供分布式应用服务开发的一站式解决方案。 此项目包含开发分布式应用服务的必需组件,方便开发者通过 Spring C...

WPF中元素拖拽的两个实例

  今天结合之前做过的一些拖拽的例子来对这个方面进行一些总结,这里主要用两个例子来说明在WPF中如何使用拖拽进行操作,元素拖拽是一个常见的操作,第一个拖拽的例子是将ListBox中的子元素拖拽到ListView的某一个节点,从而将该子元素作为当前节点的子节点。第二个例子就是将ListView的某一项拖拽到另外一项上从而使两个子项位置互换,这两个例子的原理类...

批量上传图片

实现的效果图 引用 <script src="/common/jquery-1.9.1.min.js" type="text/javascript"></script> <script type="text/javascript" src="/kindeditor-4.1.7/kindeditor-all.js">&l...

下拉菜单(css)

<!DOCTYPE html><html> <head>  <meta charset="utf-8" />  <title></title>  <style type="text/css">   *{margin:0;padding:0;}   #nav{backgrou...

MyBatis-Spring--SqlSessionTemplate实现增删改查(批量操作)

ssionTemplate是个线程安全的类,每运行一个SqlSessionTemplate时,它就会重新获取一个新的SqlSession,所以每个方法都有一个独立的SqlSession,这意味着它是线称安全的。 第一步:创建spring-mybatis.xml文件并配置数据源 这里使用DBCP数据库连接池的方式: <!-- 第一步:配置数据源--使用...

图片灯箱插件——lightBox

  该插件可以用圆角的方式展示选择中的图片,使用按钮查看上下张图片,在加载图片时自带进度条,还能以自动播放的方式浏览图片,调用格式如下: $(linkimage).lightBox({options}) 其中linkimage参数为包含图片的<a>元素名称,options为插件方法的配置对象。 例如,以列表的方式在页面中展示全部的图片,当用户...