基于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层影响. 最后我想到使用 ...
随机推荐
- 为不是函数的对象 'dbo.xxxx' 提供了参数。如果这些参数要作为表提示,则需要使用 WITH 关键字
为不是函数的对象 'dbo.xxxxxx' 提供了参数.如果这些参数要作为表提示,则需要使用 WITH 关键字 犯错误原因:给视图加条件了.. 用.where(a=>a.ID=xxx.ID);
- 【POJ3693】Maximum repetition substring (SA)
这是一道神奇的题目..论文里面说得不清楚,其实是这样...如果一个长度为l的串重复多次,那么至少s[1],s[l+1],s[2*l+1],..之中有相邻2个相等...设这时为j=i*l+1,k=j+l ...
- [SDOI2011][bzoj2286] 消耗战 [虚树+dp]
题面: 传送门 思路: 看到所有询问中的点数总和是十万级别的,就想到用虚树~\(≧▽≦)/~啦 首先,树形dp应该是很明显可以看出来的: 设dp[u]表示以u为根的子树(不包括u)中的宝藏岛全部切断的 ...
- 数学课(math)
数学课(math) 题目描述 wzy又来上数学课了-- 虽然他很菜,但是数学还是懂一丢丢的.老师出了一道题,给定一个包含nn个元素的集合P=1,2,3,-,nP=1,2,3,-,n,求有多少个集合A⊆ ...
- [01] radio ,checkbox 表单文字对齐
http://www.cnblogs.com/wangsir015/p/5555818.html 这几天在做表单时总会碰到复选框(checkbox)和单选框(radio)与文字不对齐的问题,要不是ch ...
- 【16】vuex2.0 之 getter
有的组件中获取到 store 中的state, 需要对进行加工才能使用,computed 属性中就需要写操作函数,如果有多个组件中都需要进行这个操作,那么在各个组件中都写相同的函数,那就非常麻烦,这 ...
- Master of Sequence
Master of Sequence 时间限制: 10 Sec 内存限制: 128 MB 题目描述 There are two sequences a1,a2,...,an , b1,b2,..., ...
- 前端知识点总结——CSS
1.CSS的概述 1.什么是CSS? CSS:Cascading Style Sheets层叠样式表,级联样式表(简称:样式表) 2.作用 设置HTML网页元素的样式 3.HTML与CSS的关系 HT ...
- [LeetCode] Number of 1 Bits 位操作
Write a function that takes an unsigned integer and returns the number of ’1' bits it has (also know ...
- luogu 3406 海底高铁 前缀和
题目链接 题意 给定一个数轴上的若干城市\(1,2,3,...,n\),在第\(i\)到\(i+1\)\((1\leq i\lt n)\)个城市间有铁路,通行方式可为 \(1.\)每次买票(花费\(a ...






