【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发现其中有很多属性事件不能 ...
随机推荐
- Java实现中文数字转换为阿拉伯数字
/** * 中文數字转阿拉伯数组[十万九千零六十 --> 109060] * @author 雪见烟寒 * @param chineseNumber * @return */ @Suppress ...
- Valid Parentheses 使用递归的解法
class Solution { public: bool isValid(string s) { ||s.size()%!=)return false; unordered_map<char, ...
- [Notes] AWS Automation using script and AWS CLI
(c) 2014 Amazon Web Services, Inc. and its afflialtes, All rights reserved. The content in this file ...
- 20151208Study
20151208-----------------------------------------------------* Her main interest now is raising her ...
- C++拷贝构造函数
拷贝构造函数是一种特殊的构造函数,其定义为第一个参数为为本类型的一个引用或者是常引用,且无其它参数或者其它参数为默认值,例如下面的函数: X::X(const X&); X::X(X& ...
- iOS Sonar 集成流程
https://gold.xitu.io/entry/5781e6872e958a0054c93368 作者:advancer_chen,原文链接:http://my.oschina.net/Chen ...
- which type of VS files should be committed into a version control system
which type of VS files should be committed into a version control system? aps, no: last resource edi ...
- SEO是企业发展的永恒主题
最近接触很多客户问同一个问题,明明自己的网站花的时间很多,界面设计的很美,该考虑到的优化都考虑了,反而我那么优秀的网站却不如一个自己行业里的一个垃圾网站排名高,我没排名而对方的排名却很高?我每天坚持更 ...
- STM32 使用DMA+DAC+TIMER 输出正弦波
之前已经简单论述过,根据我个人菜鸟的了解与认识,对之前的知识进行整理回顾: DMA:我的理解就是一个通道,或者是一座桥梁.在静态内存到静态内存,或者外设到静态内存间的一个通讯的通道.建立这个通道的好处 ...
- MIUI系统安全中心之自启动管理解密
迄今为止,Android系统的手机已经在整个手机市场中占有很大的比重.其中小米手机更是因为它的性价比和销售模式普遍的出现在了人们的日长生活中. 废话不多说,进入正题.作为一个Android的开发者,避 ...