WPF WindowChrome 自定义窗体

一、标准Window

窗口由两部分构成:工作区,非工作区,图中出工作区之外都是非工作区。

 

二、WindowChrome的基本概念

WindowChrome的作用:将客户区域扩展至整个窗体(遮住了非客户区),同时提供部分标准窗体的功能。

若要自定义窗口,同时保留其标准功能,可以使用WindowChrome类。 WindowChrome类允许您控制的客户端和应用程序窗口的非工作区之间的边界。

<WindowChrome.WindowChrome>
    <WindowChrome />
</WindowChrome.WindowChrome>

运行效果如图:

 

 

UseAeroCaptionButtons:表示标题栏上的那三个默认按钮是否可以命中,因为我们想要自己管理这三个按钮的样式、显示或隐藏,所以设置为False  

GlassFrameThickness:用于控制边框

ResizeBorderThickness:用户可以单击并拖动以调整窗口大小的区域的宽度。

CaptionHeight:指定WindowChrome的标题栏高度,允许窗体被鼠标拖动

CornerRadius:则将窗体变成了圆角

IsHitTestVisibleInChrome:穿过CaptionHeight,允许响应控件事件

示例一:

 

 

XAML代码:

<WindowChrome.WindowChrome>
    <WindowChrome CornerRadius="0"
                    CaptionHeight="0"
                    GlassFrameThickness="1"
                    UseAeroCaptionButtons="False"
                    NonClientFrameEdges="None" />
</WindowChrome.WindowChrome>
<Grid>
    <Border Height="30" Background="Red" VerticalAlignment="Top"></Border>
</Grid>

自定义窗台,同时加上阴影效果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<Style TargetType="Window" x:Key="WindowStyle">
    <!--无边框-->
    <Setter Property="ResizeMode" Value="NoResize"></Setter>
    <!--无默认样式-->
    <Setter Property="WindowStyle" Value="None"></Setter>
    <!--自定义窗体-->
    <Setter Property="WindowChrome.WindowChrome">
        <Setter.Value>
            <WindowChrome GlassFrameThickness="-1" CaptionHeight="30" CornerRadius="0"/>
            <!--CaptionHeight:标题栏高度,允许窗体被鼠标拖动-->
            <!--CornerRadius:窗体边框圆角-->
            <!--GlassFrameThickness:窗体边框大小-->
        </Setter.Value>
    </Setter>
    <!--阴影效果-->
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Window}">
                <Border BorderThickness="10" CornerRadius="10">
                    <Border.Effect>
                        <DropShadowEffect ShadowDepth="0" BlurRadius="10" Color="#AAAAAA"/>
                    </Border.Effect>
                    <ContentPresenter />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

 

 

  

参考:
WindowChrome自定义Window Style:https://www.cnblogs.com/dino623/p/custom_window_style_using_WindowChrome.html

使用WindowChrome自定义Window Style:https://www.cnblogs.com/dino623/p/CustomWindowStyle.html

WPF中自定义标题栏时窗体最大化处理之WindowChrome:https://www.cnblogs.com/huaxia283611/p/wpf-maximize-windowchrome.html

WPF 窗口大小自适应:https://blog.csdn.net/weixin_34268843/article/details/89581243

WPF 设置属性使窗口不可改变大小:https://blog.csdn.net/qq_39704682/article/details/95475855

WindowChrome的功能详解:https://www.cnblogs.com/cdaniu/p/16875714.html

 WPF的MainWindow设置背景透明仍然显示黑色Black问题

<Window ...
        AllowsTransparency="True"
        Foreground="{x:Null}"
        Background="{x:Null}"
        FocusVisualStyle="{x:Null}">

注意要设置AllowsTransparency=true,允许透明色,否则就是黑色

   

window 拖动

protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
{
    base.OnMouseLeftButtonDown(e);
    if (e.ButtonState == MouseButtonState.Pressed)
        DragMove();
}

  

窗口失去焦点

protected override void OnDeactivated(EventArgs e)
{
    base.OnDeactivated(e);
    this.Close();
}

  

设置窗口内容自适应

<Window SizeToContent="WidthAndHeight"

 

判断项目中的某个窗体是否已经打开或者已经存在

foreach (Window item in Application.Current.Windows)
{
     if (item is window1) return;
}

  

posted @   microsoft-zhcn  阅读(636)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
点击右上角即可分享
微信分享提示