概述
本项目的目的是制作一个上位机并且显示多个相机的拍摄画面,所以需要创建多个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;
}
}
}
}