C# WPF通过WindowChrome自定义窗体

概述

 在WPF界面开发中,系统默认的窗口比较丑,有时候想自定义窗体,比如微信的客户端窗口这样:使得左边的一块顶到最上端,如下图所示:

51219c4d0d8e70aee152773d2e42e99e.png

这时候我们可以 WindowStyle="None",AllowsTransparency="True"去掉默认的窗体边框,然后添加最小最大和关闭的按钮,然后重写相关的功能实现

<TextBlock x:Name="lblTitle" Text="自定义窗体" Foreground="White" FontSize="14" Margin="10 0 0 0" VerticalAlignment="Center"/><StackPanel Orientation="Horizontal" HorizontalAlignment="Right"><Button WindowChrome.IsHitTestVisibleInChrome="True" Name="button_MiniSize" Content="─" Style="{StaticResource btn_nap}" HorizontalAlignment="Right" Foreground="White" Margin="0 0 5 0" Height="30" Width="30"/><Button WindowChrome.IsHitTestVisibleInChrome="True" Name="button_MaxSize" Content="☐" Style="{StaticResource btn_nap}" HorizontalAlignment="Right" Foreground="White" Margin="0 0 5 0" Height="30" Width="30"/><Button WindowChrome.IsHitTestVisibleInChrome="True" x:Name="btn_Close" Content="✕" Style="{StaticResource btn_nap}" HorizontalAlignment="Right" Foreground="White" Margin="0 0 5 0" Height="30" Width="30"/></StackPanel>

但是这样做的话,这就不贴近原生窗口体验了,

-. 需要写大量代码实现Window本来的拖动、改变大小、最大化最小化等行为;

-. 各种其它细节的修改,比如:最大化会覆盖任务栏等;

为了保持最大的原生的同时以少量代码实现自定义窗体,我们使用WindowChrome去实现会更加便捷和优雅.

WindowChrome用法举例

<Window x:Class="WpfApp13.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:WpfApp13"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800" Background="{x:Null}" FontWeight="ExtraLight" ResizeMode="CanResize" WindowStartupLocation="CenterScreen"><Window.Style><Style TargetType="Window"><Setter Property="WindowChrome.WindowChrome"><Setter.Value><WindowChromeCornerRadius="0"CaptionHeight="30"GlassFrameThickness="-1"UseAeroCaptionButtons="True"NonClientFrameEdges="None"/></Setter.Value></Setter>
</Style></Window.Style><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="Auto"/><ColumnDefinition Width="*"/></Grid.ColumnDefinitions><Image Source="left1.png"   Stretch="Fill"/><Grid  Grid.Column="1" ><Grid.RowDefinitions><RowDefinition Height="40"/><RowDefinition Height="32"/><RowDefinition Height="*"/></Grid.RowDefinitions><Grid  Grid.Row="0" ><Menu Margin="2,8,200,0"  VerticalAlignment="Center" WindowChrome.IsHitTestVisibleInChrome="True" Background="Transparent"><MenuItem Header="C#技术交流⑥群(111)" FontSize="15" /></Menu></Grid><Grid Grid.Row="2"><TextBlockHorizontalAlignment="Center"VerticalAlignment="Center"FontSize="50"FontWeight="Bold"Foreground="blue"Text="呆萌气质小可爱" /></Grid></Grid></Grid>
</Window>

运行结果:

a7d9a409056a78ed80411a57a0ba0c46.png

WindowChrome用法说明

UseAeroCaptionButtons:表示标题栏上的那三个默认按钮是否可以命中,这里设置为true,如果要自己管理则设置为false。

GlassFrameThickness和ResizeBorderThickness:这两个属性用于控制边框,及用户可以单击并拖动以调整窗口大小的区域的宽度;其中GlassFrameThickness用来设置距离区域的厚度,设置为-1,可以使得区域覆盖整个界面;ResizeBorderThickness可以设置窗口缩放的边框厚度,不宜设置过大。

CaptionHeight:指定WindowChrome的标题栏高度;我这里设置的是30。设置为0表示界面无法响应鼠标的任何操作(拖动窗口, 双击标题栏的最大化最小化。。。仅仅是行为区域,并不影响外观)。

NonClientFrameEdges:即指定哪一边不属于客户区。用法举例:

<WindowChrome.WindowChrome><WindowChrome NonClientFrameEdges="Left,Bottom,Right" />
</WindowChrome.WindowChrome>

要使用WindowChrome,最简洁语法如下:

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

然后得到的窗体拥有默认窗口的所有窗口行为,

此外需要注意的是,如果元素在CaptionHeight的高度内,是无法响应鼠标事件的,此时需要给元素设置属性WindowChrome.IsHitTestVisibleInChrome="True",很常见的问题,在自定义标题按钮的时候,会发现自己点击不了标题按钮!

源码下载

链接:https://pan.baidu.com/s/1ilUXW3JzrCLQX2xFINmByw

提取码:6666

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/282186.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转载】递推公式的特征方程及通项公式

先贴上链接&#xff1a;http://blog.csdn.net/happykocola/article/details/73933314 因为最近在复习初赛&#xff0c;然后碰到了这道题&#xff0c;并不会做&#xff0c;才发现有这么高明的方法... 已知递推关系式&#xff1a; f(n)5f(n-1)-6f(n-2) (n>1) f(0)1 f(1)…

【leetcode】75. Sort Colors

题目如下&#xff1a; 解题思路&#xff1a;我的解题思路是遍历数组&#xff0c;遇到0删除该元素并插入到数组头部&#xff0c;遇到1则不处理&#xff0c;遇到2删除该元素并插入到数组尾部。 代码如下&#xff1a; class Solution(object):def sortColors(self, nums):"&q…

Seal-Report: 开放式数据库报表工具

Seal Report是.Net的一个基于Apache 2.0 开源工具&#xff0c;完全用C# 语言编写&#xff0c;最新的6.6 版本采用.NET 6&#xff0c;github: https://github.com/ariacom/Seal-Report。Seal Report提供了一个完整的框架&#xff0c;用于从任何数据库或任何非SQL源生成每日报告。…

《Ceph源码分析》——第2章,第2节Buffer

本节书摘来自华章出版社《Ceph源码分析》一书中的第2章&#xff0c;第2.2节Buffer&#xff0c;作者常涛&#xff0c;更多章节内容可以访问云栖社区“华章计算机”公众号查看 2.2 BufferBuffer就是一个命名空间&#xff0c;在这个命名空间下定义了Buffer相关的数据结构, 这些数…

eclipse在server中tomcat server找不到的问题

想要在eclipse的server新建tomcat服务器然而不知道怎么回事找不到Tomcat 7.0 Server 下面的红圈是tomcat server服务器&#xff08;更新后才出现&#xff09; 网上找的很久&#xff0c;只是找到在eclipse中安装tomcat插件的方法 Tomcat免安装版的环境变量配置以及Eclipse下的To…

PHP根据指定url生成二维码图片

一、composer安装 http://packagist.p2hp.com/packages/codeitnowin/barcode 二、使用 调用generateQrCode()方法即可实现生成二维码图片并输出下载给用户 <?php namespace manage\Test;use CodeItNow\BarcodeBundle\Utils\QrCode; use common\extensions\Helper; use y…

CA 周记 - 派福利!通过 Azure 零成本进入 CUDA 编程

我们在配置深度学习环境的时候&#xff0c;除了安装各种库和框架外&#xff0c;如果需要 GPU 加速&#xff0c;还需要配置 CUDA 。那 CUDA 是什么 &#xff1f;它的作用是什么 &#xff1f;CUDA 编程介绍01什么是 CUDA&#xff1f;CUDA (Compute Unified Device Architecture) …

《视图更新与关系数据库理论》——2.1 关系和关系变量

本节书摘来自异步社区出版社《视图更新与关系数据库理论》一书中的第2章&#xff0c;第2.1节&#xff0c;作者&#xff1a;【美】C.J. Date&#xff08;达特&#xff09;&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。 2.1 关系和关系变量 每一个关系都有一…

PHP格式化全国省市区列表

一、代码部分 /*** 获取全国省市区列表&#xff08;格式化后&#xff09;*/public function getRegionList(){$data CoreRegion::find()->select([national_code, region_name, parent_id, region_level])->asArray()->all();$data $this->assembleRegionData($…

从 C# 崩溃异常 中研究 页堆 布局

一&#xff1a;背景 1.讲故事最近遇到一位朋友的程序崩溃&#xff0c;发现崩溃点在富编辑器 msftedit 上&#xff0c;这个不是重点&#xff0c;重点在于发现他已经开启了 页堆 &#xff0c;看样子是做了最后的挣扎。0:000> !analyze -v EXCEPTION_RECORD: (.exr -1) Except…

Win10笔记本不显示wifi列表

一、问题描述 1、连接有线网络时&#xff0c;只显示连接到的有线网络&#xff0c;而不显示wifi列表 2、不连接有线网络时&#xff0c;同样不显示wifi列表 二、解决方案 1、Win R 打开运行&#xff0c;并输入services.msc 2、回车确定&#xff0c;找到WLAN AutoConfig项&…

搭建WeApacheb网站服务器

本地yum源安装mkdir /opt/dvd (先用mkdir去根下opt目录下建一个名字叫dvd的目录)mount /dev/sr0 /opt/dvd (用mount命令&#xff0c;挂载光盘设备&#xff08;/dev/sr0&#xff09;,将光盘挂载到刚刚建立的dvd目录下&#xff08;/opt/dvd&#xff09;)写yum源配置文件|-cd…

PHP的构成及生命周期

一、PHP开源源代码下载地址&#xff1a; https://github.com/php/php-src.git 二、PHP的构成 1、目录结构 2、目录分析 &#xff08;1&#xff09;sapi目录是PHP的应用接口层。 &#xff08;2&#xff09;main为php的主要代码&#xff0c;主要是输入/输出、Web通信、PHP框架…

《Adobe After Effects CS6完全剖析》——动画:最重要的是关系

本节书摘来自异步社区《Adobe After Effects CS6完全剖析》一书中的第2章&#xff0c;动画&#xff1a;最重要的是关系&#xff0c;作者 【美】Mark Christiansen&#xff08;马克克里斯琴森&#xff09;&#xff0c;译者 苗玉敏&#xff0c;郭圣路&#xff0c;曹玉臣&#xff…

Oracle即将发布的全新Java垃圾收集器 ZGC

Java 11的特性集合已经确定&#xff0c;其中包含了一些非常棒的特性。新版本提供了一个全新的垃圾回收器ZGC&#xff0c;它由甲骨文开发&#xff0c;承诺在TB级别的堆上实现非常低的停顿时间。在本文中&#xff0c;我们将介绍甲骨文开发ZGC的动机、ZGC的技术概览以及ZGC带来的一…

如何获取 OSS AccessKeyId、AccessKeySecret

开通阿里云oss&#xff1a;https://www.aliyun.com/product/oss 1、点击概览 — AccessKey 注&#xff1a;官方链接 2、出现下图&#xff0c;选择“开始使用子用户Access Key” 3、填写用户名&#xff0c;并点击确定 4、这时会给你的手机发送验证码确定是本人操作&#xff0c;…

【网络爬虫入门02】HTTP客户端库Requests的基本原理与基础应用

【网络爬虫入门02】HTTP客户端库Requests的基本原理与基础应用 广东职业技术学院 欧浩源 2017-10-15 1、引言 实现网络爬虫的第一步就是要建立网络连接并向服务器或网页等网络资源发起请求。urllib是目前最常用的做法&#xff0c;然而Requests会比urlib更加方便&#xff0c;能…

《零信任的基石:使用 SPIFFE 为基础设施创建通用身份》翻译电子书分享

国庆假期除了去浙江和安徽玩了一圈欣赏江南山水和徽派建筑之外&#xff0c;还抽空翻译了一本电子书。本书译自 Solving the Bottom Turtle — a SPIFFE Way to Establish Trust in Your Infrastructure via Universal Identity。你可以选择在线阅读&#xff08;推荐&#xff09…

《Outlook时间整理术》一创建和使用自己的文件夹结构

本节书摘来异步社区《Outlook时间整理术》一书中的第1章&#xff0c;作者&#xff1a; 【德】Lothar Seiwert , Holger Woeltje 译者&#xff1a; 欧阳宇&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。 创建和使用自己的文件夹结构 花费约两小时为电子邮件…

《实用软件架构:从系统环境到软件部署 》——2.4 架构视图与架构视点

本节书摘来自华章出版社《实用软件架构&#xff1a;从系统环境到软件部署》一书中的第2章&#xff0c;第2.4节&#xff0c;作者&#xff1a;[印]蒂拉克米特拉&#xff08;Tilak Mitra&#xff09;著&#xff0c;爱飞翔 译&#xff0c;更多章节内容可以访问云栖社区“华章计算机…