很多应用需要定制化窗口,而窗口定制化不能绕过的一个问题是标题栏定制化。

基于wpf的窗口程序,一般会通过透明,去边框化的方式将原有的标题栏遮挡。

默认情况下,wpf 窗口的标题栏是这样的, 这时最化小,最大化/还原和关闭的行为都是

像正常windows程序的行为,不需要添加任何代码。

设置 WindowStyle="None" 之后,标题栏的图标,标题以及三个按钮都不见了。但是标题栏的还留

下一步部分,如下所示

需要添加在窗口属性中添加

AllowsTransparency="True" Background="Transparent" 才能隐藏这块区域。整个窗口成了透明的

可以任任意定制的区域。

通过以下代码定义我们自己想要的标题栏和客户区域

 <Grid><Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="*"/></Grid.RowDefinitions><Grid Background="Blue" x:Name="titleBar"><Grid.ColumnDefinitions><ColumnDefinition Width="Auto"/><ColumnDefinition Width="*"/><ColumnDefinition Width="Auto"/><ColumnDefinition Width="Auto"/><ColumnDefinition Width="Auto"/></Grid.ColumnDefinitions><ContentControl ContentTemplate="{StaticResource Icon_CaptionFlyoutBtnHome}" Margin="10 0 0 0"/><TextBlock Grid.Column="1" HorizontalAlignment="Left" VerticalAlignment="Center" Text="由你定制" Margin="10 0 0 0"/><Button x:Name="btnMin" Grid.Column="2" ToolTip="最小化" Width="30" Height="30" VerticalAlignment="Center" Style="{StaticResource PureImageButtonStyle}" ContentTemplate="{StaticResource Icon_minimize}"/><Button x:Name="btnRestore"  Grid.Column="3" ToolTip="还原" Width="30" Height="30" Margin="10 0 0 0" VerticalAlignment="Center" Style="{StaticResource PureImageButtonStyle}" ContentTemplate="{StaticResource Icon_MinWnd}"/><Button x:Name="btnClose"  Grid.Column="4" ToolTip="关闭" Width="30" Height="30" Margin="10 0 20 0" VerticalAlignment="Center" Style="{StaticResource PureImageButtonStyle}" ContentTemplate="{StaticResource Icon_close}"/></Grid><Border Grid.Row="1" Background="White"><TextBlock VerticalAlignment="Center" Text="Add any content" HorizontalAlignment="Center"/></Border></Grid>

效果如下:

但是此时,这个标题栏除了样子,还不具标题栏该有的可拖动、最小化,最大化/还原,关闭的功能。

为这三个按钮加上事件以及整个工具栏的拖动事件。

窗口可以通过工具栏拖动了,最小化,半闭也正常,只不过这个时候发现最大化时,窗口会将系统的

状态栏挡住。

如果不考虑扩展屏,那么可以在窗口的构造函数中通过添加以下代码,限制窗口高度, 使最大化不至于

挡住系统任务栏。

MaxHeight = SystemParameters.WorkArea.Height;

但是如果有扩展屏,当程序被拖曳到扩展屏时,那么最大化依然会把护展屏的任务栏覆盖。

这时候我们需要检测程序是否在扩展屏上并作出来对应的处理。因为MaxHeight在运行过程动态改变不起效果。所以有扩展屏,即使能到扩展屏WorkArea.Height,简单重设MaxHeight并没有作用。所以最大化/还原就不能通过WindowState来实现。

这里主要通过判断当前窗口的大小与客户区大小的关系来判断窗口是否处于最大化,在非最大化的时候,保存窗口的位置与大小,以便用于恢复。关键代码如下

关于CustomizedToStateChanged的代码,全部提供在此 https://download.csdn.net/download/mochounv/16072523

其中注意一点。 Winform下面与Screen的尺寸参数是像素值,所以并不能直接将得到size赋给wpf的窗口。

WPF 自定义窗口在扩展屏的最大化相关推荐

  1. wpf 自定义窗口,最大化时覆盖任务栏解决方案

    原文:wpf 自定义窗口,最大化时覆盖任务栏解决方案 相信很多人使用wpf时会选择自定义美观的窗口,因此会设置WindowStyle="None" 取消自带的标题栏.但这样使用 W ...

  2. 518抽奖软件-支持扩展屏的实现方法

    518抽奖软件-支持扩展屏的实现方法 在开发518年会抽奖软件( www.518cj.net)的时候,软件需支持扩展屏,电脑屏后台操作,扩展大屏滚动抽奖.主要包括以下三个功能,主窗口全屏化(主屏内). ...

  3. WPF.UIShell UIFramework之自定义窗口的深度技术

    无论是在工作和学习中使用WPF时,我们通常都会接触到CustomControl,今天我们就CustomWindow之后的一些边角技术进行探讨和剖析. 窗口(对话框)模态闪动(Blink) 自定义窗口的 ...

  4. 解决winform自定义窗体在扩展显示器最大化不能充满屏幕

    参考:(60条消息) winForm在多显示器(主显示器 + 扩展显示器)上显示最大化和还原操作._梦的远方~的博客-CSDN博客 原因: 我开发用笔记本,缩放设置为150%:同时外接一个扩展屏,缩放 ...

  5. [WPF疑难] 继承自定义窗口

    [WPF疑难] 继承自定义窗口 原文 [WPF疑难] 继承自定义窗口 [WPF疑难] 继承自定义窗口 周银辉 项目中有不少的弹出窗口,按照美工的设计其外边框(包括最大化,最小化,关闭等按钮)自然不同于 ...

  6. WPF绘制自定义窗口

    原文:WPF绘制自定义窗口 WPF是制作界面的一大利器,下面就用WPF模拟一下360的软件管理界面,360软件管理界面如下: 界面不难,主要有如下几个要素: 窗体的圆角 自定义标题栏及按钮 自定义状态 ...

  7. WPF - 自定义标记扩展

    在使用WPF进行编程的过程中,我们常常需要使用XAML的标记扩展:{Binding},{x:Null}等等.那么为什么WPF提供了XAML标记扩展这一功能,我们又如何创建自定义的标记扩展呢.这就是本文 ...

  8. WPF自定义控件与样式(5)-Calendar/DatePicker日期控件自定义样式及扩展

    原文:WPF自定义控件与样式(5)-Calendar/DatePicker日期控件自定义样式及扩展 一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐 ...

  9. Qt 自定义标题栏,最小化、最大化、关闭窗口,双击最大化,鼠标拖动等效果实现

    文章目录 前言 效果 代码 .pro文件 widget.h widget.cpp widget.ui title.h title.cpp title.ui 前言 本次实验内容为Qt自定义标题栏,最小化 ...

最新文章

  1. 如何设置文字的位置html5,怎么设置文字在表格中的位置
  2. php host头攻击,Apache/Nginx中Host头攻击的一些差异
  3. 运行 YunYang1994/tensorflow-yolov3 所遇到的一些问题记录
  4. 海思Hi3516A(5)3D降噪
  5. HttpClientFactory的套路,你知多少?
  6. 私人linux远程连接,Linux远程连接 - osc_5g1gl9wp的个人空间 - OSCHINA - 中文开源技术交流社区...
  7. 未初始化的类,通过指针调用其非静态函数
  8. LNMP环境下搭建SVN服务器
  9. 《微积分的力量》读书摘记
  10. 欧姆龙plc交互协议hostlink
  11. deamon守护线程
  12. mysql中排名次_mysql:名次排名 (并列与不并列)
  13. 理解ASP.NET Core - 发送Http请求(HttpClient)
  14. EXCEL装逼指南之动态进度条(项目经理必备技能)
  15. 《禅与摩托车维修艺术》
  16. 华三HCL免费下载体验
  17. python接口自动化--接口测试工具介绍(详解)
  18. 超融合和服务器关系_一文读懂超融合服务器
  19. js获取的当前时间的月份--getFullYear()、getMonth()、getDate(),本示例是获取当前月份的开始跟结束
  20. 【Vivado那些事儿】Vivado环境一览

热门文章

  1. 几款常见的视频格式转换器 1
  2. 中国防近视镜片市场深度研究分析报告
  3. 使用R语言绘制富集条形图,轻松分析基因表达数据
  4. 电脑看不了视频?这样做,可以快速解决!
  5. unbuntu18.04-----bilibili网页端无法播放视频
  6. Linux下USB抓包工具UsbMon的使用和包数据格式解析
  7. Vue3 reactive 源码分析
  8. 柯西-施瓦茨不等式的证明
  9. markdown的文章样式:字体、颜色、大小、背景色、图片、缩进
  10. 在 JavaScript 中实现删除前弹出对话框确认删除