一、背景

  吃产品的亏,上设计的当,最后死在变化上。

  现在的产品和设计都喜欢在窗口上做一些事,比如让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。的更多相关文章

  1. WPF窗体中嵌入/使用WinForm类/控件(基于.NET Core)

    如题,WPF中嵌入WinForm的做法,网络上已经很多示例,都是基于.NET XXX版的. 今天King様在尝试WPF(基于.NET Core 3.1)中加入Windows.Forms.ColorDi ...

  2. WPF 获取鼠标屏幕位置、窗口位置、控件位置

    原文:WPF 获取鼠标屏幕位置.窗口位置.控件位置 public struct POINT { public int X; public int Y; public POINT(int x, int ...

  3. WPF窗口和用户控件事件相互触发

    问题1: WPF项目里有一个窗口和一个用户控件,窗口和用户控件里都有一个Button,点击窗口里的Button如何触发用户控件里Button的Click事件 解答: //窗口代码 public par ...

  4. 解决CPC撰写文档报错问题“无法获取“AxforApplication”控件的窗口句柄。不支持无窗口的 ActiveX 控件”

    最近公司需要把官方CPC电子申请移植到项目中,在移植完成后,撰写文档总是出现“无法获取“AxforApplication”控件的窗口句柄.不支持无窗口的 ActiveX 控件”,另楼主头疼很久,网上寥 ...

  5. Windows常见窗口样式和控件风格

    Windows常见窗口样式和控件风格 王佰营 徐丽红 一.窗口样式 WS_POPUP 弹出式窗口(不能与WS_CHILDWINDOW样式同时使用)WS_CHILDWINDOW 子窗口(不能与WS_PO ...

  6. WPF 程序如何移动焦点到其他控件

    原文:WPF 程序如何移动焦点到其他控件 WPF 中可以使用 UIElement.Focus() 将焦点设置到某个特定的控件,也可以使用 TraversalRequest 仅仅移动焦点.本文介绍如何在 ...

  7. WPF自定义控件(二)の重写原生控件样式模板

    话外篇: 要写一个圆形控件,用Clip,重写模板,去除样式引用圆形图片可以有这三种方式. 开发过程中,我们有时候用WPF原生的控件就能实现自己的需求,但是样式.风格并不能满足我们的需求,那么我们该怎么 ...

  8. WPF中自定义的DataTemplate中的控件,在Window_Loaded事件中加载机制初探

    原文:WPF中自定义的DataTemplate中的控件,在Window_Loaded事件中加载机制初探         最近因为项目需要,开始学习如何使用WPF开发桌面程序.使用WPF一段时间之后,感 ...

  9. 《Programming WPF》翻译 第5章 7.控件模板

    原文:<Programming WPF>翻译 第5章 7.控件模板 如果仔细的看我们当前的TTT游戏,会发现Button对象并没有完全为我们工作.哪些TTT面板有内圆角? 图5-14 这里 ...

  10. WPF中嵌入WinForm中的webbrowser控件

    原文:WPF中嵌入WinForm中的webbrowser控件 使用VS2008创建WPF应用程序,需使用webbrowser.从工具箱中添加WPF组件中的webbrowser发现其中有很多属性事件不能 ...

随机推荐

  1. H5学习系列之Communication API

    1 .postMessage API 首先介绍一下什么是iframe? 百度百科里这样写道:IFRAME,HTML标签,作用是文档中的文档,或者浮动的框架(FRAME). 我的理解就是网页中的网页. ...

  2. 在linux中添加ftp用户,并设置相应的权限

    在linux中添加ftp用户,并设置相应的权限,操作步骤如下: 1.环境:ftp为vsftp.被限制用户名为test.被限制路径为/home/test 2.建用户:在root用户下: useradd ...

  3. java面试中问题

    HashMap数据结构 http://blog.csdn.net/weiyouyin/article/details/5693496 HashMap冲突 http://www.blogjava.net ...

  4. Vue组件之自定义表单组件

    今天又看了一遍vue的文档,记得之前学习的时候,官方文档中有提过,v-model指令是一个语法糖,做两件事,一个是给表单控件元素绑定value,第二个是当输入时更新绑定的值,不过后来在"表单 ...

  5. python day2 列表的常用操作方法

    #创建列表方法一li = ['aa','bb','cc']方法二li = list(['aa','bb','cc'])print(li)返回 ['aa', 'bb', 'cc']----------- ...

  6. ES6中的var let const应如何选择

    javascript世界里面的每个人都在说有关ECMAScript 6 (ES6,也称作ES 2015)的话题,对象的巨大变化 ( 类 , super() , 等), 函数 (默认参数等), 以及模块 ...

  7. 【笔记】memorymanagement-whitepaper-150215

    3 GC概念 Gc的职责: 1)  分配内存 2)  保证被引用的对象驻留内存 3)  对象不可达后将其占用内存回收 被引用对象被称为 “存活对象”. 不再被引用的对象称为“垃圾对象”. 找到垃圾对象 ...

  8. WinCE下读取注册表获得SD路径

    WinCE下读取注册表获得SD路径 [要点]WinCE注册表中[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\SDMemory\] 下键Folde ...

  9. H5中的拖拽事件

    最近浏览了张鑫旭大神的基于HTML5 drag/drop模块拖动插入排序删除完整实例,感觉受益匪浅.于是将最做的demo记录下来. 首先浏览一下事件,这些事件比较好记,只要记住用在谁的身上就好了,无非 ...

  10. flask_关注者,联系人和好友

    在这节我们实现的功能比较复杂,就是实现用户"关注"和"取消关注"的功能. 一个用户可以关注多个其他的用户,一个用户也可以被其他多个用户所关注,这样看的话,在数据 ...