通过


WindowChrome 类

定义

表示一个对象,该对象描述窗口非工作区的自定义。

public ref class WindowChrome : System::Windows::Freezable
public class WindowChrome : System.Windows.Freezable
type WindowChrome = class
    inherit Freezable
Public Class WindowChrome
Inherits Freezable
继承

注解

WindowChrome 类使你可以将 Windows Presentation Foundation (WPF) 内容扩展到通常为操作系统的窗口管理器保留的窗口的非工作区。

标准 Windows

标准窗口由两个重叠矩形组成。 外部矩形是 非工作区,通常称为 部件版式。 它由操作系统的窗口管理器绘制和管理。 其维度由标准操作系统设置确定。 非客户端帧提供标准窗口功能和行为。 其中包括标题按钮(最小化、最大化和关闭)、窗口边框、调整大小和移动行为、应用程序图标和标题以及系统菜单。 内部矩形是 工作区。 它包含应用程序的内容,并由应用程序绘制和管理。 有关 WPF 应用程序中的窗口的详细信息,请参阅 WPF Windows 概述

下图显示了标准窗口的各个部分。

窗口元素

自定义 Windows

可以通过将 Window.WindowStyle 属性 None 设置为或使用 WindowChrome 类来自定义窗口边框。

WindowStyle.None

自定义 WPF 应用程序窗口外观的一种方法是将 Window.WindowStyle 属性 None设置为 。 这会从窗口中删除非客户端框架,只保留工作区,你可以向其应用自定义样式。 但是,删除非客户端帧时,还会丢失系统提供的功能和行为,例如标题按钮和窗口大小调整。 另一个副作用是窗口在最大化时将覆盖 Windows 任务栏。 设置 WindowStyle.None 使你能够创建一个完全自定义的应用程序,但也要求在应用程序中实现自定义逻辑来模拟标准窗口行为。

WindowChrome

若要在保留其标准功能的同时自定义窗口,可以使用该 WindowChrome 类。 该 WindowChrome 类将窗口框架的功能与视觉对象分开,并允许你控制应用程序窗口的客户端和非客户端区域之间的边界。 该 WindowChrome 类允许通过扩展工作区覆盖非工作区,将 WPF 内容置于窗口框架中。 同时,它通过两个不可见区域保留系统行为: 调整边框标题 区域的大小。

使用类创建自定义窗口 WindowChrome 有两个主要部分。 首先,通过设置对象上 WindowChrome 公开的属性来自定义窗口的非客户端部分。 然后,为窗口提供一个模板,用于定义扩展到非工作区的应用程序部分。 对象上WindowChrome公开的属性是ResizeBorderThicknessCaptionHeightCornerRadiusGlassFrameThickness

ResizeBorderThickness 属性指定应用程序窗口外部的不可见边框,用户可以单击并拖动以调整窗口的大小。

CaptionHeight 属性指定窗口顶部的不可见区域,该区域启用通常与标题栏关联的系统行为。 这些行为包括:单击并拖动以移动窗口,双击以最大化窗口,右键单击以显示系统菜单。

调整边框和标题区域的大小没有任何视觉元素;它们仅定义响应输入和启用标准系统提供的窗口行为的区域。

CornerRadius 属性指定窗口角舍入的量。 如果为窗口启用了玻璃框架,则此属性没有任何影响。

GlassFrameThickness 属性指定窗口周围的玻璃框架的宽度。 默认情况下,它使用属性指定的 WindowNonClientFrameThickness 系统值来模拟标准窗口的外观。 使用玻璃框架时,“最小化”、“最大化”和“关闭”的标题按钮可见且交互。 该应用程序负责显示应用程序图标和标题文本。 可以将属性设置为 GlassFrameThickness 使玻璃框架变宽或窄于默认值。

注意

更改属性时 GlassFrameThickness 标题按钮的大小不会更改。 如果玻璃框架顶部的高度小于标题按钮的高度,标题按钮将不完全可见。

若要使没有玻璃框架的自定义窗口,请将 GlassFrameThickness 该属性设置为统一值 0。 这将禁用和隐藏标准字幕按钮。

若要扩展玻璃框架以覆盖整个窗口,请将 GlassFrameThickness 属性设置为任何一端的负值。 当属性 GlassFrameThickness 设置为任何一端的负值时,其强制值将等于 GlassFrameCompleteThickness

注释

Aero 是 Windows Vista 中引入的 Windows 桌面外观和功能的一组视觉增强功能。 航空视觉上更明显的特征之一是半透明玻璃窗边框。 Windows Aero 由桌面窗口管理器(DWM)的桌面组合功能启用。

Windows Aero 玻璃效果在所有操作系统上不受支持,并且可以在受支持的操作系统上禁用。 如果 Windows Aero 不可用,则无论属性值如何 GlassFrameThickness ,都不会显示玻璃框架。 此属性指定的边框区域将改为显示为黑色。检查属性 IsGlassEnabled 以验证 Windows Aero 玻璃效果是否可用。 如果玻璃效果不可用,则应提供不使用玻璃框架的备用窗口样式,或者通过将窗口样式设置为 null 来使用标准窗口。

通过指定用于定义框架内容外观和行为的 ControlTemplate,将 WPF 内容扩展到窗口框架中。 将 ControlTemplate 的 TargetType 设置为要自定义的窗口的类型。

<ControlTemplate TargetType="{x:Type local:MainWindow}">

默认情况下,窗口非工作区内的任何视觉元素部分都不具有交互性。 若要在非工作区中启用交互式元素,请将 WindowsChrome.IsHitTestVisibleInChrome 附加属性附加到元素并将其设置为 true。

以下 XAML 标记显示了使用 WindowChrome 类自定义窗口所需的主要元素。

<Style x:Key="StandardStyle" TargetType="{x:Type local:MainWindow}">
    <Setter Property="shell:WindowChrome.WindowChrome">
        <Setter.Value>
            <shell:WindowChrome />
        </Setter.Value>
    </Setter>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:MainWindow}">
                <Grid>
                    <Border Background="White"
                            Margin="{Binding Source={x:Static shell:SystemParameters2.Current}, Path=WindowNonClientFrameThickness}">
                        <ContentPresenter Content="{TemplateBinding Content}" />
                    </Border>
                    <TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Title}"
                               VerticalAlignment="Top" HorizontalAlignment="Left"
                               Margin="36,8,0,0"/>
                    <Image Source="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Icon}"
                           VerticalAlignment="Top" HorizontalAlignment="Left"
                           Margin="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(shell:WindowChrome.WindowChrome).ResizeBorderThickness}"
                           Width="{Binding Source={x:Static shell:SystemParameters2.Current}, Path=SmallIconSize.Width}"
                           shell:WindowChrome.IsHitTestVisibleInChrome="True"/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

第一个 setter 将 WindowChrome 附加到窗口。 它使用 WindowChrome 属性的所有默认值,这使得窗口看起来像标准窗口。

<Setter Property="shell:WindowChrome.WindowChrome">
    <Setter.Value>
        <shell:WindowChrome />
    </Setter.Value>
</Setter>

窗口模板必须指定内容演示者才能显示应用程序中指定的窗口的内容。 默认情况下,WindowChrome 类扩展工作区以覆盖非客户端边框。 若要发现玻璃框架,需要指定 ContentPresenter 周围的边距。 此标记指定内容演示者周围有白色背景的边框,以模拟标准窗口的外观。 它还指定绑定到 WindowNonClientFrameThickness 属性的边距,该属性获取帧的默认系统宽度。

<Border Background="White"
    Margin="{Binding Source={x:Static shell:SystemParameters2.Current}, Path=WindowNonClientFrameThickness}">
    <ContentPresenter Content="{TemplateBinding Content}" />
</Border>

WindowChrome 类不显示应用程序图标和标题;它们必须作为自定义内容添加到边框。 以下 XAML 添加图像和文本块以显示图标和标题。 这两个元素都绑定到窗口上的相应属性。 图像宽度绑定到 SmallIconSize 宽度,该宽度获取图标的默认系统大小。 IsHitTestVisibleInChrome 附加属性在图像上设置,以便它可以接收鼠标事件。

<Image Source="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Icon}"
       VerticalAlignment="Top" HorizontalAlignment="Left"
       Margin="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(shell:WindowChrome.WindowChrome).ResizeBorderThickness}"
       Width="{Binding Source={x:Static shell:SystemParameters2.Current}, Path=SmallIconSize.Width}"
       shell:WindowChrome.IsHitTestVisibleInChrome="True"/>

<TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Title}"
           VerticalAlignment="Top" HorizontalAlignment="Left"
           Margin="36,8,0,0"/>

构造函数

名称 说明
WindowChrome()

初始化 WindowChrome 类的新实例。

字段

名称 说明
CaptionHeightProperty

标识 CaptionHeight 依赖属性。

CornerRadiusProperty

标识 CornerRadius 依赖属性。

GlassFrameThicknessProperty

标识 GlassFrameThickness 依赖属性。

IsHitTestVisibleInChromeProperty

标识 IsHitTestVisibleInChrome 依赖属性。

NonClientFrameEdgesProperty

标识 NonClientFrameEdges 依赖属性。

ResizeBorderThicknessProperty

标识 ResizeBorderThickness 依赖属性。

ResizeGripDirectionProperty

标识 ResizeGripDirection 依赖属性。

UseAeroCaptionButtonsProperty

标识 UseAeroCaptionButtons 依赖属性。

WindowChromeProperty

标识 WindowChrome 依赖属性。

属性

名称 说明
CanFreeze

获取一个值,该值指示是否可以使对象不可修改。

(继承自 Freezable)
CaptionHeight

获取或设置窗口顶部标题区域的高度。

CornerRadius

获取或设置一个值,该值指示窗口角的舍入量。

DependencyObjectType

获取包装 DependencyObjectType 此实例的 CLR 类型。

(继承自 DependencyObject)
Dispatcher

获取与此DispatcherDispatcherObject关联的值。

(继承自 DispatcherObject)
GlassFrameCompleteThickness

获取 -1 的均匀厚度。

GlassFrameThickness

获取或设置一个值,该值指示窗口周围的玻璃边框的宽度。

IsFrozen

获取一个值,该值指示对象当前是否可修改。

(继承自 Freezable)
IsSealed

获取一个值,该值指示此实例当前是否密封(只读)。

(继承自 DependencyObject)
NonClientFrameEdges

获取或设置一个值,该值指示客户端不拥有窗口框架的边缘。

ResizeBorderThickness

获取或设置一个值,该值指示用于调整窗口大小的边框的宽度。

UseAeroCaptionButtons

获取或设置一个值,该值指示是否在 Windows 航空标题按钮上启用命中测试。

附加属性

名称 说明
IsHitTestVisibleInChrome

表示一个对象,该对象描述窗口非工作区的自定义。

ResizeGripDirection

表示一个对象,该对象描述窗口非工作区的自定义。

WindowChrome

获取或设置附加到窗口的 WindowChrome 实例。

方法

名称 说明
CheckAccess()

确定调用线程是否有权访问此 DispatcherObject权限。

(继承自 DispatcherObject)
ClearValue(DependencyProperty)

清除属性的本地值。 要清除的属性由 DependencyProperty 标识符指定。

(继承自 DependencyObject)
ClearValue(DependencyPropertyKey)

清除只读属性的本地值。 要清除的属性由一个 DependencyPropertyKey.

(继承自 DependencyObject)
Clone()

创建对象的值的深层副本的可修改克隆 Freezable。 复制对象的依赖属性时,此方法复制表达式(可能不再解析),但不会复制动画或其当前值。

(继承自 Freezable)
CloneCore(Freezable)

使用基(非动画化)属性值将实例创建指定的 Freezable 克隆(深层副本)。

(继承自 Freezable)
CloneCurrentValue()

使用其当前值创建可修改的 Freezable 克隆(深层副本)。

(继承自 Freezable)
CloneCurrentValueCore(Freezable)

使实例成为使用当前属性值指定的 Freezable 可修改克隆(深层副本)。

(继承自 Freezable)
CoerceValue(DependencyProperty)

强制指定依赖属性的值。 这是通过调用中调用依赖属性CoerceValueCallback的属性元数据中指定的任何DependencyObject函数来实现的。

(继承自 DependencyObject)
CreateInstance()

初始化 Freezable 类的新实例。

(继承自 Freezable)
CreateInstanceCore()

创建类的新实例 WindowChrome

Equals(Object)

确定提供的 DependencyObject 是否等效于当前 DependencyObject

(继承自 DependencyObject)
Freeze()

使当前对象不可修改,并将其 IsFrozen 属性设置为 true

(继承自 Freezable)
FreezeCore(Boolean)

Freezable使对象不可修改,或测试是否可以使其不可修改。

(继承自 Freezable)
GetAsFrozen()

使用基(非动画化)属性值创建冻结的副本 Freezable。 由于副本已冻结,因此引用复制任何冻结的子对象。

(继承自 Freezable)
GetAsFrozenCore(Freezable)

使实例成为使用基属性(非动画化)属性值指定的 Freezable 冻结克隆。

(继承自 Freezable)
GetCurrentValueAsFrozen()

创建使用当前属性值的 Freezable 冻结副本。 由于副本已冻结,因此引用复制任何冻结的子对象。

(继承自 Freezable)
GetCurrentValueAsFrozenCore(Freezable)

使当前实例成为指定的 Freezable冻结克隆。 如果对象具有动画依赖属性,则复制其当前动画值。

(继承自 Freezable)
GetHashCode()

获取此 DependencyObject代码的哈希代码。

(继承自 DependencyObject)
GetIsHitTestVisibleInChrome(IInputElement)

从指定的输入元素获取附加属性的值 IsHitTestVisibleInChrome

GetLocalValueEnumerator()

创建一个专用枚举器,用于确定哪些依赖项属性具有本地 DependencyObject设置的值。

(继承自 DependencyObject)
GetResizeGripDirection(IInputElement)

从指定的输入元素获取附加属性的值 ResizeGripDirection

GetType()

获取当前实例的 Type

(继承自 Object)
GetValue(DependencyProperty)

返回此实例 DependencyObject上的依赖属性的当前有效值。

(继承自 DependencyObject)
GetWindowChrome(Window)

获取指定Window属性的WindowChrome附加属性的值。

InvalidateProperty(DependencyProperty)

重新评估指定依赖属性的有效值。

(继承自 DependencyObject)
MemberwiseClone()

创建当前 Object的浅表副本。

(继承自 Object)
OnChanged()

修改当前 Freezable 对象时调用。

(继承自 Freezable)
OnFreezablePropertyChanged(DependencyObject, DependencyObject, DependencyProperty)

此成员支持 Windows Presentation Foundation (WPF) 基础结构,不应直接从代码使用。

(继承自 Freezable)
OnFreezablePropertyChanged(DependencyObject, DependencyObject)

确保为 DependencyObjectType 刚刚设置的数据成员建立适当的上下文指针。

(继承自 Freezable)
OnPropertyChanged(DependencyPropertyChangedEventArgs)

重写要DependencyObject调用的任何Changed处理程序的OnPropertyChanged(DependencyPropertyChangedEventArgs)实现,以响应类型的Freezable更改依赖项属性。

(继承自 Freezable)
ReadLocalValue(DependencyProperty)

返回依赖属性的本地值(如果存在)。

(继承自 DependencyObject)
ReadPreamble()

确保 Freezable 从有效线程访问该对象。 继承者 Freezable 必须在读取非依赖属性的数据成员的任何 API 的开头调用此方法。

(继承自 Freezable)
SetCurrentValue(DependencyProperty, Object)

设置依赖项属性的值,而不更改其值源。

(继承自 DependencyObject)
SetIsHitTestVisibleInChrome(IInputElement, Boolean)

设置指定输入元素上的附加属性的值 IsHitTestVisibleInChrome

SetResizeGripDirection(IInputElement, ResizeGripDirection)

设置指定输入元素上的附加属性的值 ResizeGripDirection

SetValue(DependencyProperty, Object)

设置依赖属性的本地值,由依赖属性标识符指定。

(继承自 DependencyObject)
SetValue(DependencyPropertyKey, Object)

设置只读依赖属性的本地值,由 DependencyPropertyKey 依赖属性的标识符指定。

(继承自 DependencyObject)
SetWindowChrome(Window, WindowChrome)

设置指定Window属性的WindowChrome附加属性的值。

ShouldSerializeProperty(DependencyProperty)

返回一个值,该值指示序列化进程是否应序列化所提供的依赖属性的值。

(继承自 DependencyObject)
ToString()

返回一个表示当前对象的字符串。

(继承自 Object)
VerifyAccess()

强制调用线程有权访问此 DispatcherObject权限。

(继承自 DispatcherObject)
WritePostscript()

Changed为该事件Freezable引发并调用其OnChanged()方法。 派生自 Freezable 的类应在修改未存储为依赖属性的类成员的任何 API 末尾调用此方法。

(继承自 Freezable)
WritePreamble()

验证 Freezable 是否未冻结,以及是否正在从有效的线程上下文访问它。 Freezable 继承者应在写入非依赖属性的数据成员的任何 API 的开头调用此方法。

(继承自 Freezable)

活动

名称 说明
Changed

修改它包含的对象时 Freezable 发生。

(继承自 Freezable)

适用于