C#上位机学习-多窗口显示时,如何在放大某一个窗口的同时不显示其他窗口

概述

        本项目的目的是制作一个上位机并且显示多个相机的拍摄画面,所以需要创建多个WindowsFormsHost窗口来实现多个画面同时显示,其中遇到一个问题,当我双击某一窗口并放大该窗口时,相机画面的一部分会被其他窗口所遮挡到并且双击其他窗口的位置也会放大另一个窗口,从而导致故障,只能重新启动才能正常运行。

问题

        设计的串口ui为

        当我没有显示画面时,双击放大某一个窗口并无发现问题。

        但当我显示其中一个相机画面后,双击放大窗口,相机画面便会被遮挡,并且要预防双击到其他窗口。

 解决方法

        最后发现当我把其他窗口的visibility设为hidden之后,再次启动并测试之后发现达到了我预期的效果(双击放大某一个窗口时其他窗口被覆盖或不显示),所以只要双击放大某一个窗口的同时将其他的几个窗口都隐藏掉,当双击恢复窗口的大小是再将其他的几个窗口显现,便能解决以上遇到的问题。

核心代码

        //双击窗口,窗口变大,再次双击就恢复原样
        private bool isWindowMaximized = false;
        // 定义一个字段来存储窗口的原始位置和大小
        private Rect originalWindowRect;
        private void displayArea_MouseDoubleClick(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            // 获取对应的 PictureBox 控件
            PictureBox click_displayArea = sender as PictureBox;
            if (click_displayArea == null) return;

            // 查找对应的 WindowsFormsHost
            WindowsFormsHost windowsFormsHost = null;
            foreach (var host in FindVisualChildren<WindowsFormsHost>(this))
            {
                if (host.Child == click_displayArea)
                {
                    windowsFormsHost = host;
                    break;
                }
            }
            if (windowsFormsHost == null) return;
            // 获取 WindowsFormsHost 的父控件 Border
            Border clickedBorder = windowsFormsHost.Parent as Border;
            if (clickedBorder == null) return;
            var window = Window.GetWindow(clickedBorder);
            if (window == null) return;
            if (isWindowMaximized)
            {
                // 恢复原始大小和位置
                clickedBorder.Margin = new Thickness(originalWindowRect.Left, originalWindowRect.Top, 0, 0); // 使用原始 Margin
                clickedBorder.Width = originalWindowRect.Width;
                clickedBorder.Height = originalWindowRect.Height;
                // 重新显示其他窗口
                foreach (var host in FindVisualChildren<WindowsFormsHost>(this))
                {
                    Border parentBorder = host.Parent as Border;
                    if (parentBorder != null && parentBorder != clickedBorder)
                    {
                        parentBorder.Visibility = Visibility.Visible;
                    }
                }
            }
            else
            {
                // 保存原始大小和位置
                originalWindowRect = new Rect(clickedBorder.Margin.Left, clickedBorder.Margin.Top, clickedBorder.Width, clickedBorder.Height);
                // 设置新大小和位置
                clickedBorder.Margin = new Thickness(20, 63, 0, 0); // 设置新 Margin
                clickedBorder.Width = 540;
                clickedBorder.Height = 451;
                // 隐藏其他窗口
                foreach (var host in FindVisualChildren<WindowsFormsHost>(this))
                {
                    Border parentBorder = host.Parent as Border;
                    if (parentBorder != null && parentBorder != clickedBorder)
                    {
                        parentBorder.Visibility = Visibility.Hidden;
                    }
                }
            }

            // 切换放大状态标志
            isWindowMaximized = !isWindowMaximized;
        }
        // Helper method to find all children of a specific type WpfPanel
        private static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
        {
            if (depObj != null)
            {
                for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
                {
                    DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
                    if (child != null && child is T)
                    {
                        yield return (T)child;
                    }

                    foreach (T childOfChild in FindVisualChildren<T>(child))
                    {
                        yield return childOfChild;
                    }
                }
            }
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值