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

基于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. mysql提示The server quit without updating PID file /usr/local/mysql/data/localhost.localdomain.pid
  2. Android添加垂直滚动scrollview
  3. 服务3000万制造企业 阿里云数字工厂诚邀合伙人
  4. 可以获得索引值码_SEO优化细节,怎样优化才能让网站获得更好的排名?
  5. Laravel核心解读--Facades
  6. TortoiseSVN版本管理的注意点
  7. jQtouch 初体验
  8. Eclipse在线安装SVN插件
  9. 【业界分享】字节跳动如何用 7 年,成为腾讯最可怕的对手?张一鸣一语道破...
  10. N的倍数 51Nod - 1103 (抽屉原理)
  11. MySQL之InnoDB存储引擎-架构
  12. 微信小程序中英文切换
  13. cholesky分解java代码_cholesky分解的实现
  14. Vuex的使用(九)——actions的其他用法
  15. python抠图代码_五行 Python 代码实现批量抠图
  16. kinectfusion的详细介绍
  17. 【owt-server】 只sync webrtc-m79并构建
  18. 软件测试培训出来真的很难找到工作嘛?
  19. [附源码]计算机毕业设计Python基于微信小程序的网络办公系统(程序+源码+LW文档)
  20. OM | 电子商务平台中的合约选择:批发合约or代理合约?

热门文章

  1. 华为3Com\桌面型交换机\Aolynk S1008A
  2. cmd错误:找不到或无法加载主类 和 错误:找不到符号
  3. 无法处理页面,因为“页面捕捉“识别服务发生错误。(6)
  4. 如何提高记忆力?知乎live学习
  5. 照片转3d模型_科技造假?3D打印的人像逼真到让人不敢相信!
  6. 安卓便签中的图片怎么一键转发到朋友圈?
  7. 如何加声调口诀_小学拼音声调的口诀是什么??
  8. office VBA 用户窗体 控件 单元格 参数的用法与注解
  9. 微信小程序开发框架的组成
  10. 特斯拉的12V蓄电池有什么不同?