隆重推出 PresentationWindows
PresentationWindows 是一个 WPF 类库,它引入了三个派生自 Window 类的新类型,从而能够使用许多以前难以访问的窗口功能。
引言
欢迎使用 PresentationWindows!PresentationWindows 是一个与众不同的窗口类库,它引入了三个窗口类:
WndProcWindow
,它派生自 Window
,
AeroWindow
,它派生自 WndProcWindow
,
以及 MagnifyWindow
,它派生自 AeroWindow
。
WndProcWindow
类似于常规窗口,但它只是添加了一个 WndProc()
函数以方便互操作。这是此库中功能最少的类。
AeroWindow 类似于常规窗口,但它有一个 WndProc
函数,并且允许您使用简单的依赖项属性设置玻璃框扩展。它还允许您指定调整大小边框扩展,并选择性地将控件放置在窗口的标题栏区域中(如 Firefox、IE 和 Opera)。
MagnifyWindow
包含了前两个窗口类的所有功能,但又增加了一个功能。它提供了自动放大支持,在窗口上提供一个跟随光标的“放大镜”,放大其触摸到的所有内容。这利用了 WPF 中高质量的矢量图形来缩放内容而不会损失质量。当您将 MagnifyAmount
属性设置为所需的放大系数时,放大镜会自动显示和隐藏。
这是放大镜的实际效果
这适用于任何 Windows XP 及更高版本,以下屏幕截图展示了许多不同的视觉样式

背景
这是一项简单的任务:您希望通过扩展 Aero 玻璃框来使您的应用程序看起来更好。您可能已经在 Windows Forms 中尝试过,但控件上的文本难以辨认,并且需要很多技巧才能使其工作。然后您可能会尝试 WPF,这会很好用,因为 WPF 正是为了这种事情而设计的。
现在您有了一个选择:您可以 PInvoke 原始 API 来扩展玻璃框,或者您可以使用 WPF 功能区提供的 WindowChrome
类。API 可以工作,但(希望迟早)您可能会发现它没有考虑 DPI 差异,这意味着如果您的 DPI 高于默认值,玻璃将无法完全扩展。
WindowChrome 考虑了 DPI,但使用它,您将放弃操作系统通常提供的所有标题栏功能。然后是基本和经典主题的问题,它们需要自己的实现才能工作,因为在这些场景中禁用了桌面合成。
有关于如何手动克服这些问题的教程,但它们困难且耗时。我找过,但似乎没有任何库能将所有这些功能封装到一个可以在 XAML 中初始化的专业库中。直到现在,才有了这样的库。
使用代码
使用代码非常简单。您只需要做以下几件事:
1:添加对类库的引用
2:在您的 MainWindow.xaml 文件中添加一个 XAML 命名空间引用(见下文),并告诉 XAML 创建 PresentationWindows 类之一的实例而不是常规 Window。
3:在 MainWindow.xaml.cs(或 .vb)中更改您的 MainWindow
类,使其派生自 PresentationWindows 类之一。
以下示例展示了如何设置一个 MagnifyWindow,放大系数设置为 2。
<presentation:MagnifyWindow
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:presentation="clr-namespace:PresentationWindows;assembly=PresentationWindows"
xmlns:local="clr-namespace:My_Calendar" x:Class="My_Calendar.MainWindow"
Title="MainWindow" Height="350" Width="525" MagnifyAmount="2" FrameExtension="0,20,0,0">
<Grid>
</Grid>
</presentation:MagnifyWindow>
AeroWindow 类有许多新属性,包括以下内容:
FrameExtension (默认="0,0,0,0") - 这是一个类型为 "WindowFrameThickness
" 的特殊属性,它指定在每个相应侧面进一步扩展窗口框的数量。类型 "WindowFrameThickness
" 的工作方式与常规 Thickness 类似,但它也定义了 "Full" 扩展(完全扩展窗口框,就像小工具窗口一样),并允许窗口的某些侧面根本没有框架(例如,FrameExtension="*,0,*,15" 只留下顶部和底部的窗口 chrome)。此属性是此库中最重要的一个新属性。
CaptionHeight
(默认="Default") - 这是另一个类型为 CaptionHeight
的特殊属性。这应该设置为标题栏的所需高度,或 "Default"。
ResizeBorderExtension
(默认="Full") - 这也是 WindowFrameThickness
类型,工作方式与 FrameExtensionProperty
类似,但用于“调整大小边框”(定义为用户可以拖动以调整窗口大小的窗口区域)的扩展程度。
AlwaysShowBasicFrame
(默认="False") - 设置为 "true" 以强制窗口表现得好像桌面合成 (Windows Aero) 始终被禁用一样。它实际上做的是使用窗口框架的基本版本而不是 Aero 边框。
TitleBarContent
(Default=null) - 这是一个特殊属性,指定应在窗口标题栏中显示什么。实际内容仅在指定了不同模板时才会显示,因为默认模板不显示此内容。
MagnifyWindow
类型还添加了一个新属性
MagnifyAmount
(默认=1) - 此属性指定“放大镜”放大内容的程度。当此属性设置为 1 时,不显示放大镜。但当它设置为不同值时,窗口上会显示一个放大镜(见上面的屏幕截图)。这个放大镜跟随鼠标,放大其路径中的所有内容。背景中的窗口 chrome 不会被放大,当使用 Aero 边框时,基本标题按钮会打开,以便它们可以使用。
另外,您可能已经注意到,要使用 TitleBarContent
,您需要指定不同的模板。我已经包含了一个名为“Templates”的静态类,您可以从中获取这些模板。这里有四个模板:
AeroWindowNormalTemplate
AeroWindowTitleBarContentTemplate
MagnifyWindowNormalTemplate
MagnifyWindowTitleBarContentTemplate
这些应该不言自明。您可以通过在窗口定义中添加以下属性来在 XAML 中设置它们:
Template="{x:Static presentation:Templates.MagnifyWindowTitleBarContentTemplate}"
值得关注的点
在传统的 Window 类中,您通常不会设置 Template 属性,因为 WPF 会为您处理,而且您不会像设计按钮那样设计窗口。AeroWindow
(及其所有派生类型)则不同。您可以为窗口 XAML 定义一个模板来影响其外观,并使用绑定和部件使其在基本和经典主题下正常工作,并使用正确的系统大小。
在做这些的时候,我学会了如何在代码中编写模板。所有四个默认模板实际上都是用代码编写的。
传统上,Windows 视觉样式不是 WPF 的一部分,因为按钮是矢量样式的,并且与 Windows 视觉样式系统是独立的。如果我在这里尝试这样做,保持正确的窗口样式将是一场噩梦,所以我采取了一些巧妙的方法。基本窗口边框是考虑到视觉样式而绘制的,通过使用 Windows Forms 视觉样式类。这几乎是完美的,但一个缺点是您无法获得高质量的矢量缩放,因为这在 Windows 中存储为位图。
此外,在 Windows 8 中,人们可能会告诉您 Aero 已经消失了。这根本不是真的,事实上,根本无法将其关闭!Aero 唯一消失的是透明窗口和 Flip 3D。窗口框架仍然以相同的方式工作。因此,这在 Windows 8 中有效,并为您的窗口增添了您喜欢的颜色的美妙触感(参见屏幕截图)。
历史
2012 年 11 月 2 日 - 添加了屏幕截图。
2012 年 11 月 3 日 - 添加了更多说明。
我非常喜欢制作这个库和这篇文章。请给我一些反馈!谢谢。