WPF中窗体最大化问题处理

栏目: ASP.NET · 发布时间: 7年前

内容简介:1、 设置窗体相关属性:窗体需要支持透明,并将窗体设置为透明;设置ResizeMode,否则最大化时,边框会有影响。

博客分类: FAQ

遇到的问题信息

  • 问题:当 WindowStyle=None 时,窗口最大化,不显示任务栏 —— 即窗体是全屏效果。
  • 解决中遇到的问题列表【主要涉及到任务栏发生改变后的一些问题处理】:
    • 最大化时,任务栏被遮盖;
    • 最大化后,拖动任务栏,无法自适应窗体;
    • 最大化后,拖动任务栏,窗体还原,还原数据丢失,始终显示最大;
    • 最大化后,拖动任务栏,窗体还原,设置之前保存的窗体位置数据,再次设置,由于和之前一样,窗体位置信息不生效;

解决方案

  • 思路:窗体最大化时,将窗体透明化,设置内部元素Grid的Margin属性,从而显示出任务栏
  • 步骤:

1、 设置窗体相关属性: WindowStyle="None" AllowsTransparency="True" Background="Transparent" ResizeMode="CanMinimize"

窗体需要支持透明,并将窗体设置为透明;设置ResizeMode,否则最大化时,边框会有影响。

2、 添加窗体最大化/还原代码如下:

double normaltop;
double normalleft;
double normalwidth;
double normalheight;
/// <summary>
/// 最大化/还原处理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Btn_maximize_Click(object sender, RoutedEventArgs e)
{
    //wpf最大化 全屏显示任务栏处理
    if (this.WindowState == WindowState.Normal)
    {
        normaltop = this.Top;
        normalleft = this.Left;
        normalwidth = this.Width;
        normalheight = this.Height;

        double top = SystemParameters.WorkArea.Top;
        double left = SystemParameters.WorkArea.Left;
        double right = SystemParameters.PrimaryScreenWidth - SystemParameters.WorkArea.Right;
        double bottom = SystemParameters.PrimaryScreenHeight - SystemParameters.WorkArea.Bottom;
        gd_main.Margin = new Thickness(left, top, right, bottom);

        this.WindowState = WindowState.Maximized;               
    }
    else
    {
        this.WindowState = WindowState.Normal;

        //必须先设置为0,在重新设值,若前后值一样,会失效 --拖动任务栏后,还原-始终显示在屏幕最左上方
        this.Top = 0;
        this.Left = 0;
        this.Width = 0;
        this.Height = 0;

        this.Top = normaltop;
        this.Left = normalleft;
        this.Width = normalwidth;
        this.Height = normalheight;

        gd_main.Margin = new Thickness(0);
    }
}

3、添加任务栏变化处理

注意:此节实现仅适用于.Net Framework 4.5及以上。因为4.0及以前的版本中不包含StaticPropertyChanged事件。

不过可以通过WndProc来自己实现,其中会有一个问题:利用WndProc来监听,结果是比较实时的,而SystemParameters中的值,实时性可能会跟不上,从而获取到的值仍然是旧的。

对此有两种解决方案:

* 1、添加一个Timer 或者 直接Sleep,等待一下在SystemParameters的值【此法相对简单,但无法完全保证有效,毕竟SystemParameters中值更新的时间,还是要看.Net Framework】;

* 2、利用Windows API读取系统值,用方法SystemParametersInfo获取SPI_GETWORKAREA【微软官方其实就是用这个获取的,这样比我下面的运行效率还要高些】

另外:下面的方法可能会有系统兼容性问题,我在Windows 10上是通过的,但在Windows 8.1上,边界存在问题【不确定是不是Framework在系统上有bug】

注册事件: SystemParameters.StaticPropertyChanged += SystemParameters_StaticPropertyChanged;
添加如下代码:

private void SystemParameters_StaticPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
    if (e.PropertyName == "WorkArea")
    {
        if (this.WindowState == WindowState.Maximized)
        {
            double top = SystemParameters.WorkArea.Top;
            double left = SystemParameters.WorkArea.Left;
            double right = SystemParameters.PrimaryScreenWidth - SystemParameters.WorkArea.Right;
            double bottom = SystemParameters.PrimaryScreenHeight - SystemParameters.WorkArea.Bottom;
            gd_main.Margin = new Thickness(left, top, right, bottom);
        }
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Building Social Web Applications

Building Social Web Applications

Gavin Bell / O'Reilly Media / 2009-10-1 / USD 34.99

Building a social web application that attracts and retains regular visitors, and gets them to interact, isn't easy to do. This book walks you through the tough questions you'll face if you're to crea......一起来看看 《Building Social Web Applications》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具