• WPF最小化窗体后激活函数显示不了窗体


    WPF最小化窗体后激活函数显示不了窗体

    今天测试小哥给我提了一些问题,其中一个问题是这样的,点击web端的一个链接,是能启动本地的一个应用程序的,如果本地应用程序已启动(通过tcp进程间通信),那么应该要能显示这个本地应用窗口。但是他测试的时候发现并没有预期的效果。

    经过多次测试后,发现无效的情况是在窗体设置为最小化的时候,激活显示不了窗体,如果这个窗体只是在其它窗体后面是可以激活的。
    测试代码如下:

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.WindowState = WindowState.Maximized;
            this.SleepShow();
        }
        public void SleepShow(double sleep = 5)
        {
            DispatcherTimer dispatcherTimer = new DispatcherTimer();
            dispatcherTimer.Interval = TimeSpan.FromSeconds(sleep);
            dispatcherTimer.Tick += (sender, e) => {
                this.Activate();
                Console.WriteLine("激活显示窗体");
            };
            dispatcherTimer.Start();
        }
    }
    

    在当前窗体不是最小化状态下都是有效的,最小化就是不能使用。
    加入Topmost = true;也没用。最后的解决方法是,需要先将窗体的WindowState还原为原来的状态,肯定是非Minimized状态的。处理代码如下:

    public partial class MainWindow : Window
    {
        private WindowState windowState;
        public MainWindow()
        {
            InitializeComponent();
            this.WindowState = WindowState.Maximized;
            this.StateChanged += MainWindow_StateChanged;
            this.SleepShow();
            this.windowState = WindowState.Maximized;
        }
    
        private void MainWindow_StateChanged(object sender, EventArgs e)
        {
            if(this.WindowState == WindowState.Minimized)
            {
            }
            else
            {
                this.windowState = this.WindowState;//保存非最小化的状态
            }
        }
    
        public void SleepShow(double sleep = 5)
        {
            DispatcherTimer dispatcherTimer = new DispatcherTimer();
            dispatcherTimer.Interval = TimeSpan.FromSeconds(sleep);
            dispatcherTimer.Tick += (sender, e) => {
                if(this.WindowState == WindowState.Minimized)//判断当前如果是最小化状态,那么就需要还原,再激活
                {
                    this.WindowState = this.windowState;//还原状态
                }
                this.Activate();
                Console.WriteLine("激活显示窗体");
            };
            dispatcherTimer.Start();
        }
    }
    

    还有一个问题就是在调节窗体大小时,获取窗体中的TabControl的ActualHeight和ActualWidth的值总是不变,另外开一个应用程序去测试获取的时候,结果值又是正确的,一脸懵逼。最后往上查找节点最终发现是因为Viewbox控件导致的-V-。最后调整了ViewBox的使用位置,问题解决,自测几遍后,打包发给测试,验证通过。

  • 相关阅读:
    VC++6.0 自定义按钮,无标题对话框的拖动方法
    完整的使用线程池的多线程C/S Socket类
    树形控件Tree Control
    关闭数据执行保护
    VC++开发垃圾文件清理软件(下)
    用完成端口开发大响应规模的Winsock应用程序
    去掉右键多余显卡菜单
    自动登陆系统
    查询数据库中所有表名和表中所有字段名
    单行编辑框文本垂直居中(包含计算字体高度)
  • 原文地址:https://www.cnblogs.com/zzr-stdio/p/11883643.html
Copyright © 2020-2023  润新知