E不小心

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

代码已经迁移到 Github 上

地址:https://github.com/gaoshang212/Gsof.Xaml

Nuget:https://www.nuget.org/packages/Gsof.Xaml.BlankWindow

支持:net45、net46、net5.0-windows、net6.0-windows

一、背景

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

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

  效果:

  

  自定义一个自由的窗口自如简单。

六、源码

  源码地址:https://github.com/gaoshang212/Gsof.Xaml

七、总结

  发现博客要是分成几天写,就没什么吐嘈的了,就不总结了。

 

本文地址:http://www.cnblogs.com/gaoshang212/p/4993373.html 

  

posted on 2015-11-25 23:21  E不小心  阅读(2867)  评论(13编辑  收藏  举报