【WPF】分享自用 白板窗口(空窗口) 控件 BlankWindow,基于WindowChrome。
一、背景
吃产品的亏,上设计的当,最后死在变化上。
现在的产品和设计都喜欢在窗口上做一些事,比如让Title做很多事,好像跟人家用一样的窗口很Low似的,好像真的挺Low的。
所以,还不如弄一个黑板似的窗口,自己想加什么加什么,这样就会自由很多。
二、问题
常规实现自定义窗体,因为隐藏窗口和边框,必须要使用WindowStyle="None" 和 AllowsTransparency="True",使用这两个属性也会引发各种问题:
1. 最大化时会覆盖任务栏,全屏到是实现了。
2. 如果自己控制最大化时的大小为工作区大小,当以停靠(将窗口拖拽到窗口的最上面)的方式最大化时,会出现缝隙问题。
3. 因为没有边框,窗体的缩放(Resize)的问题。
4. 使用 AllowsTransparency="True" ,XP下渲染性能低的问题。
5. 使用 AllowsTransparency="True" ,WinFormHost无法使用的问题(包括WebBrowser)。
6. 暂时想到这么多。
三、介绍
1. 控件代码部分提取自:MahApps.Metro(这个控件库已经封装的很好了,而且控件很多,喜欢的同学可以看看)。。
2. 基于WindowChrome 相关API,源码已提取(MahApps.Metro 本身就是提取的WindowChrome代码)。
3. 添加相关的附加属性,更方便的实现拖拽、最小化、最大化和关闭。
4. 未使用 WindowStyle="None" 和 AllowsTransparency="True"
四、控件
BlankWindow
| 属性/附加属性 | 说明 |
| TitleBarHeight | 默认高度30的可拖拽区域 |
| IgnoreTaskbarOnMaximize | 最大化时忽略任务栏,默认为True |
| BlankWindow.Draggable | 为True时,当前可以拖拽移动(别忘了设置背景色哦)。 |
| BlankWindow.Minimize | 为True时,当前按钮可以使窗体最小化 |
| BlankWindow.Maximize | 为True时,当前按钮可以使窗体最大化 |
| BlankWindow.Closeable |
为True时,当前按钮可以使窗体关闭 |
五、示例
一个简单例子,三个巨丑的按钮,整个Grid可以拖动。
<blankWindow:BlankWindow x:Class="GFramework.BlankWindow.Demo.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:blankWindow="http://GFramework.org"
mc:Ignorable="d"
Height="350"
Width="525">
<Grid Background="DeepSkyBlue"
blankWindow:BlankWindow.Draggable="True">
<StackPanel>
<StackPanel Orientation="Horizontal">
<Button Content="最小化"
blankWindow:BlankWindow.Minimize="True" />
<Button Content="最大化"
blankWindow:BlankWindow.Maximize="True" />
<Button Content="关闭"
blankWindow:BlankWindow.Closeable="True" />
</StackPanel>
</StackPanel>
</Grid>
</blankWindow:BlankWindow>
效果:

Demo2:
左上可以拖动,最小化,最大化,关闭,都放在角上。
<blankWindow:BlankWindow x:Class="GFramework.BlankWindow.Demo.Demo2"
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:blankWindow="http://GFramework.org"
mc:Ignorable="d"
Title="Demo2"
Height="350"
Width="525"
TitleBarHeight="0">
<Grid>
<Border Width="100"
Height="100"
Background="DeepSkyBlue"
HorizontalAlignment="Left"
VerticalAlignment="Top"
blankWindow:BlankWindow.Draggable="True" />
<Button Content="最小化"
Width="100"
Height="100"
HorizontalAlignment="Right"
VerticalAlignment="Top"
blankWindow:BlankWindow.Minimize="True" />
<Button Content="最大化"
Width="100"
Height="100"
HorizontalAlignment="Left"
VerticalAlignment="Bottom"
blankWindow:BlankWindow.Maximize="True" />
<Button Content="关闭"
Width="100"
Height="100"
HorizontalAlignment="Right"
VerticalAlignment="Bottom"
blankWindow:BlankWindow.Closeable="True" />
</Grid>
</blankWindow:BlankWindow>
效果:

自定义一个自由的窗口自如简单。
六、源码
源码地址:http://git.oschina.net/gaoshang212/GFramework.BlankWindow
VS版本为2015,默认 .Net Framework 版本为 4.0
七、总结
发现博客要是分成几天写,就没什么吐嘈的了,就不总结了。
本文地址:http://www.cnblogs.com/gaoshang212/p/4993373.html
【WPF】分享自用 白板窗口(空窗口) 控件 BlankWindow,基于WindowChrome。的更多相关文章
- WPF窗体中嵌入/使用WinForm类/控件(基于.NET Core)
如题,WPF中嵌入WinForm的做法,网络上已经很多示例,都是基于.NET XXX版的. 今天King様在尝试WPF(基于.NET Core 3.1)中加入Windows.Forms.ColorDi ...
- WPF 获取鼠标屏幕位置、窗口位置、控件位置
原文:WPF 获取鼠标屏幕位置.窗口位置.控件位置 public struct POINT { public int X; public int Y; public POINT(int x, int ...
- WPF窗口和用户控件事件相互触发
问题1: WPF项目里有一个窗口和一个用户控件,窗口和用户控件里都有一个Button,点击窗口里的Button如何触发用户控件里Button的Click事件 解答: //窗口代码 public par ...
- 解决CPC撰写文档报错问题“无法获取“AxforApplication”控件的窗口句柄。不支持无窗口的 ActiveX 控件”
最近公司需要把官方CPC电子申请移植到项目中,在移植完成后,撰写文档总是出现“无法获取“AxforApplication”控件的窗口句柄.不支持无窗口的 ActiveX 控件”,另楼主头疼很久,网上寥 ...
- Windows常见窗口样式和控件风格
Windows常见窗口样式和控件风格 王佰营 徐丽红 一.窗口样式 WS_POPUP 弹出式窗口(不能与WS_CHILDWINDOW样式同时使用)WS_CHILDWINDOW 子窗口(不能与WS_PO ...
- WPF 程序如何移动焦点到其他控件
原文:WPF 程序如何移动焦点到其他控件 WPF 中可以使用 UIElement.Focus() 将焦点设置到某个特定的控件,也可以使用 TraversalRequest 仅仅移动焦点.本文介绍如何在 ...
- WPF自定义控件(二)の重写原生控件样式模板
话外篇: 要写一个圆形控件,用Clip,重写模板,去除样式引用圆形图片可以有这三种方式. 开发过程中,我们有时候用WPF原生的控件就能实现自己的需求,但是样式.风格并不能满足我们的需求,那么我们该怎么 ...
- WPF中自定义的DataTemplate中的控件,在Window_Loaded事件中加载机制初探
原文:WPF中自定义的DataTemplate中的控件,在Window_Loaded事件中加载机制初探 最近因为项目需要,开始学习如何使用WPF开发桌面程序.使用WPF一段时间之后,感 ...
- 《Programming WPF》翻译 第5章 7.控件模板
原文:<Programming WPF>翻译 第5章 7.控件模板 如果仔细的看我们当前的TTT游戏,会发现Button对象并没有完全为我们工作.哪些TTT面板有内圆角? 图5-14 这里 ...
- WPF中嵌入WinForm中的webbrowser控件
原文:WPF中嵌入WinForm中的webbrowser控件 使用VS2008创建WPF应用程序,需使用webbrowser.从工具箱中添加WPF组件中的webbrowser发现其中有很多属性事件不能 ...
随机推荐
- Linux中的输入重定向,变量
1 :分号 格式:命令1:命令2;命令3 说明:命令之间用分号隔开是顺序执行,命令之间没有任何逻辑关系 2 && 逻辑与 格式:命令1 && 命令2 说明:命令1正 ...
- c++ 覆盖、重载与隐藏
成员函数被重载的特征:(1)相同的范围(在同一个类中):(2)函数名字相同:(3)参数不同:(4)virtual 关键字可有可无.覆盖是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生 ...
- java基于socket公共聊天室的实现
项目:一个公共聊天室功能的实现,实现了登录聊天,保存聊天记录等功能. 一.实现代码 1.客户端 ChatClient.java import java.io.BufferedReader; impor ...
- Daily Scrum 12.13
今日完成任务: 已经解决用户管理异常:解决主页TAG显示不正确;解决下载量不正确,完成下载量的计数. 明日任务: 黎柱金 解决文档打开时全部是同一个PDF的BUG 冯飘飘 优化右侧显示最佳资源的算法 ...
- 用ajax获取后台数据,返回json数据,怎么在前台使用?
用ajax获取后台数据,返回json数据,怎么在前台使用呢?后台 C# code ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 if (dataType == &qu ...
- dp、px、dpi、ppi
概念: dpi(Dots Per Inch):每英寸上的点数,最初用于衡量打印物上每英寸的点数密度,打印机在一英寸内打多少个点.DPI值越小越不精细. ppi(Pixels Per Inch):每英寸 ...
- AndroidLinker与SO加壳技术之上篇
1. 前言 Android 系统安全愈发重要,像传统pc安全的可执行文件加固一样,应用加固是Android系统安全中非常重要的一环.目前Android 应用加固可以分为dex加固和Native加固,N ...
- IIS7.5 由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面
IIS7.5中将一网站应用程序池托管管道模式改为经典后,网站页面打不开,错误信息: 引用内容 HTTP 错误 404.2 - Not Found由于 Web 服务器上的“ISAPI 和 CGI 限制” ...
- select值的获取及修改
例子: <select id="a" name="a"> <options value="1">a</opti ...
- 一些比较常用的Linux命令
我有一些是我是参考别人的,忘记是谁了,在这里要感谢一下ta. #命令格式就是就是由命令+空格+一些命令用法的选项(可以选择多个用法)+空格+/+目录名或者文件名,有些是直接打命令就可以了,比如ls - ...