基于WPF系统框架设计(5)-Ribbon整合Avalondock 2.0实现多文档界面设计(二)
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框架设计中也整合多文档界面布局功能,下面就来实施做一个案例。
- 准备工作:在这网址上下载AvalonDock和实例: http://avalondock.codeplex.com/
- 主要布局框架:
- Xceed.Wpf.AvalonDock.dll
- 其他的是主题样式模板:
- Xceed.Wpf.AvalonDock.Themes.Expression.dll
- Xceed.Wpf.AvalonDock.Themes.Metro.dll
- Xceed.Wpf.AvalonDock.Themes.VS2010.dll
- 添加引用
把这些程序集添加到项目引用中,如下图:
- 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:
Blue:
Black:
- 如何做到支持动态加载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>
运行后如下图:
现在只是一个空的框架,还没有添加文档界面喔,下面就来实现动态加载文档页面。
后台代码,我实现了动态创建三个文档:
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());
}
现在能够动态加载文档了,就几行代码就能搞定,可是,文档也是空的哟,怎么办?
附:我想到下一篇博文介绍这一块的设计,我向来喜欢短小精悍文章。
基于WPF系统框架设计(5)-Ribbon整合Avalondock 2.0实现多文档界面设计(二)的更多相关文章
- 基于WPF系统框架设计(4)-Ribbon整合Avalondock 2.0实现多文档界面设计(一)
前些时间研究了WPF的一些框架,感觉基于Prism框架的MVVM模式对系统的UI与逻辑分离很好,所以就按照之前Winform的框架设计,用WPF做了一套,感觉比Winform要强很多. MVVM模式和 ...
- 基于WPF系统框架设计(6)-整合MVVM框架(Prism)
应用场景 我们基础的框架已经搭建起来了,现在整合MVVM框架Prism,在ViewModel做一些逻辑处理,真正把界面设计分离出来. 这样方便我们系统开发分工合作,同时提高系统可维护性和灵活性. 具体 ...
- 基于WPF系统框架设计(3)-Fluent Ribbon界面布局
一个系统框架除了功能菜单导航,有系统内容显示区域,系统状态栏. Silver: Blue: Black: 系统界面设计,就不进行技术细节介绍了,主题以框架设计为主,Xaml源码参考: <Flue ...
- 基于WPF系统框架设计(1)-为什么要仿Office2010 Ribbon?
为什么系统框架设计使用Ribbon导航模式? 这得从Office软件的演变说起.微软为什么最后选择使用Ribbon,也许就是很多系统设计要使用Ribbon做功能导航的原因. 你是否还记得曾经使用过的M ...
- 基于WPF系统框架设计(2)-Fluent Ribbon之HelloWorld
Fluent/Ribbon是微软在其最新桌面操作系统Windows 7中使用的图形用户界面. Windows平台的进化,伴随着系统图形界面的重新设计.从Windows XP到Windows Vista ...
- 基于WPF系统框架设计(8)-PasswordBox传值到ViewMode
应用场景 我要做一个系统登录功能,需要传用户名和密码到ViewModel中,可是PasswordBox传值到ViewModel中好像跟TextBox等控件不一样.这里需要用到附加属性. 附加属性:一个 ...
- 基于WPF系统框架设计(7)-TextBox/PasswordBox在ViewModel中支持回车命令
应用场景 我现在做一个系统登录功能,要求在PasswordBox上输完密码后回车,能够响应Enter事件,并执行ViewModel中对应的方法.如果登录成功则隐藏当前窗口显示主窗体,登录失败则焦点返回 ...
- 基于WPF系统框架设计(10)-分页控件设计
背景 最近要求项目组成员开发一个通用的分页组件,要求是这个组件简单易用,通用性,兼容现有框架MVVM模式,可是最后给我提交的成果勉强能够用,却欠少灵活性和框架兼容性. 设计的基本思想 传入数据源,总页 ...
- 基于WPF系统框架设计(9)-多值绑定之IMultiValueConverter
应用场景 我想把View层的一个布局控件和功能按钮传到ViewModel层,达到动态变更布局,同时灵活获取功能按钮的属性,让View和ViewModel完全分离,而不受View层影响. 最后我想到使用 ...
随机推荐
- 用js立即执行函数开发基于bootstrap-multiselect的联动参数菜单
代码调用方式如下: data=[{F0:总分类cd,F1:总分类name,F2:大分类cd,F3:大分类name,F4:中分类cd,F5:中分类name,F6:小分类cd,F7:小分类name},.. ...
- 介绍 Active Directory 域服务 (AD DS) 虚拟化
TechNet 库 Windows Server Windows Server 2012 R2 和 Windows Server 2012 服务器角色和技术 Active Directory Acti ...
- spring整合mybatis详解
在上篇螃蟹已经说明spring注解的最经典配置,接下来开始整合mybatis,这样整个项目就相对完整了. 有关本实例的源码可以到 <spring MVC注解实例及说明文档> 下载. 如需转 ...
- IOS开发学习笔记006 - 指针
C语言 指针 简单使用如下: int *p;//定义 int a = 10; p = &a;//赋值 int * b = &a;//定义并赋值 定义格式:类型 *指针变量名: 注意事项 ...
- centOS如何设置时间同步
1.进入系统-管理-时间和日期 2.这个需要root权限才能进行设置,在弹出框中填入root密码 3.设置时间和日期-勾选同步,并且选择NTP时间服务器,点击确定 4.选择时区为亚洲上海点击保存 ...
- C#知识点<3>
1. C# 结构(Struct) 在 C# 中,结构是值类型数据结构.它使得一个单一变量可以存储各种数据类型的相关数据.struct 关键字用于创建结构. 结构是用来代表一个记录.假设您想跟踪图书馆中 ...
- 截图神器-snipaste
基础操作 Snipaste 是一个简单但强大的贴图工具,同时也可以执行截屏.标注等功能. 截屏 开始截图 快捷键(默认为 F1) 鼠标左键 单击托盘图标 何谓一次 成功的截图 保存到剪贴板 ( / ...
- MAC抓包工具charles(青花瓷)
下载链接:http://pan.baidu.com/s/1pL6ClBX 配置教程:http://blog.csdn.net/jiangwei0910410003/article/details/41 ...
- ZOJ 3781 Paint the Grid Reloaded(BFS+缩点思想)
Paint the Grid Reloaded Time Limit: 2 Seconds Memory Limit: 65536 KB Leo has a grid with N rows ...
- 省选算法学习-插头dp
插头dp?你说的是这个吗? 好吧显然不是...... 所谓插头dp,实际上是“基于连通性的状态压缩dp”的简称,最先出现在cdq的论文里面 本篇博客致力于通过几道小小的例题(大部分都比较浅显)来介绍一 ...