【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 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM