Windows 8 WPF 功能区






4.82/5 (21投票s)
本文展示了一个受 Office 2013 和 Visual Studio 2013 启发的 Windows 8 主题 WPF Ribbon。
引言
虽然 Microsoft 专注于其 RT 平台,但仍有一些开发工作使用 WPF 完成。
不幸的是,当前的 WPF Ribbon 看起来已经过时且缺乏吸引力,希望出现新版本可能徒劳无功。 不满意当前的状态,我花了一个周末时间实现了一个
基于当前 Office 2013 风格,并带有一点 Visual Studio 风格的简单窗口控件。
虽然它看起来与 Office 和 Visual Studio 非常相似,但敏锐的眼睛会发现其中的差异,如果您正在寻找完全相同的副本,那么自己进行修改应该很容易。
您可以从 GitHub 下载源代码。
https://github.com/crystalbyte/ribbon
使用代码
使用该代码非常简单,并且与当前的 WPF Ribbon 实现非常相似。
窗口
除了明显的 foreground 和 background 属性外,还有两个额外的属性会影响外观。 HoverBrush 允许您设置鼠标悬停在 ribbon 上时使用的画笔,而 AccentBrush 明显会设置窗口的强调色。
下面的代码向您展示了如何声明基本窗口。
<ui:RibbonWindow x:Class="Crystalbyte.MainWindow"
...
xmlns:ui="clr-namespace:Crystalbyte.UI;assembly=Crystalbyte.Ribbon">
<ui:RibbonWindow.ApplicationMenu>
<ui:ApplicationMenu />
</ui:RibbonWindow.ApplicationMenu>
<ui:RibbonWindow.Ribbon>
<ui:Ribbon />
</ui:RibbonWindow.Ribbon>
<Grid />
</ui:RibbonWindow>
与标准的 WPF Microsoft Ribbon 控件的一个区别是,状态栏是窗口不可或缺的一部分。
窗口带有新的 office 三态按钮,用于在“仅选项卡”、“全屏”和“选项卡和命令”视图之间切换。
Ribbon
Ribbon 是最简单的控件,因为它除了添加选项卡之外几乎无事可做。 但是,您可以从此处设置在应用程序菜单按钮内显示的文本。
<ui:Ribbon x:Class="Crystalbyte.Ribbon"
...
xmlns:ui="clr-namespace:Crystalbyte.UI;assembly=Crystalbyte.Ribbon"
AppMenuText="FILE">
<local:SomeTab />
</ui:Ribbon>
Ribbon 选项卡
Ribbon 选项卡与当前的 MS 实现略有不同,因为它需要 RibbonPage 来包装 RibbonGroups。 除此之外,您不会发现太多差异。
<ui:RibbonTab x:Class="Crystalbyte.Ribbon.SomeTab"
...
xmlns:ui="clr-namespace:Crystalbyte.UI;assembly=Crystalbyte.Ribbon"
Header="SOME">
<ui:RibbonPage>
<ui:RibbonGroup>
<ui:RibbonButton Command="..." />
<ui:RibbonButton Command="..." />
</ui:RibbonGroup>
</ui:RibbonPage>
</ui:RibbonTab>
应用程序菜单
与 Office 2013 风格类似,应用程序菜单直接连接到窗口并处理几乎相同的内容。 当前的实现为应用程序菜单带来了三个控件。
<ui:ApplicationMenu x:Class="Crystalbyte.Ribbon.SomeMenu"
...
xmlns:ui="clr-namespace:Crystalbyte.UI;assembly=Crystalbyte.Ribbon">
<ui:ApplicationMenuItem Header="Some Menu">
<TextBlock>Some Content</TextBlock>
</ui:ApplicationMenuItem>
<ui:ApplicationMenuSeparator />
<ui:ApplicationMenuButton Command="..." />
</ui:ApplicationMenu>
ApplicationMenuItem 在应用程序菜单区域中显示其内容,该区域包含整个窗口。 分隔符和按钮应该是不言自明的。
全部放在一起
演示项目展示了一个简单但完整的实现,看起来非常像这样。
该主题基于 Windows 8 的强调色系统运行。 您可以选择窗口的背景颜色和强调色,然后所有 ribbon 子控件都会采用该颜色。
如上面的屏幕截图所示,选项卡也可以具有上下文状态,该状态由一个简单的属性 "IsContextual" 和专用的画笔属性 "ContextualBrush" 控制。
为了保持实现的小巧和简洁,我决定不支持单个上下文中的多个选项卡,因为它需要对 ribbon 构造中使用的基本框架控件进行大规模更改。
我明确地想避免创建任何自定义控件,这就是 ribbon 仅仅是一个大规模样式化的 TabControl 的原因。
列表上的最后一件事是嵌入式支持,可以将快速访问项目添加到上层窗口栏,这些项目在应用程序关闭时仍然存在。
我希望你们中的一些人可以从该项目中受益,如果有人有任何建议或更正,我很高兴接受对 GitHub 上主存储库的拉取请求。
关注点
一旦您删除默认窗口边框,您显然也会失去一些功能,例如 Aero Snap、自动调整大小和默认窗口按钮。 在开发控件时,最困难的部分是理解 WPF 的 DPI 感知大小调整系统,尤其是在处理 Windows 7 和 Windows 8 上不同的窗口边框大小和主题时,手动设置窗口边界非常困难。