65.9K
CodeProject 正在变化。 阅读更多。
Home

隆重推出 PresentationWindows

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3投票s)

2012年10月25日

CPOL

6分钟阅读

viewsIcon

18703

downloadIcon

626

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 日 - 添加了更多说明。

我非常喜欢制作这个库和这篇文章。请给我一些反馈!谢谢。

© . All rights reserved.