一、背景
吃產品的虧,上設計的當,最后死在變化上。
現在的產品和設計都喜歡在窗口上做一些事,比如讓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
