From 40213047b1cee48144c5a1eee1778ada6f609ca1 Mon Sep 17 00:00:00 2001
From: chr <chrry550@163.com>
Date: 星期四, 07 三月 2024 16:06:08 +0800
Subject: [PATCH] 优化InnerWindow的Resize;

---
 UI/WorkControl.xaml.cs |  514 +++++++++++++++++++++++++++++++-------------------------
 1 files changed, 287 insertions(+), 227 deletions(-)

diff --git a/UI/WorkControl.xaml.cs b/UI/WorkControl.xaml.cs
index c759d76..eecf439 100644
--- a/UI/WorkControl.xaml.cs
+++ b/UI/WorkControl.xaml.cs
@@ -1,227 +1,287 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.Windows;
-using System.Windows.Controls;
-using System.Windows.Media;
-using WPFProject.Controls;
-using WPFProject.Models;
-using WPFProject.UI.Test;
-using WPFProject.Utils;
-
-namespace WPFProject.UI
-{
-    /// <summary>
-    /// WorkControl.xaml 鐨勪氦浜掗�昏緫
-    /// </summary>
-    public partial class WorkControl : UserControl,IPlugin
-    {
-        public WorkControl()
-        {
-            InitializeComponent();
-            Loaded += UserControl_Loaded;
-        }
-
-        private void ProgramList_FocusableChanged(object sender, DependencyPropertyChangedEventArgs e)
-        {
-
-        }
-
-        private List<CanvasPosition> InitGridSize()
-        {
-            List<CanvasPosition> result = new List<CanvasPosition>();
-            result.Add(new CanvasPosition
-            {
-                Left = 0,
-                Top = 0,
-                Width = 0.1 * ActualWidth -2,
-                Height = 0.5 * ActualHeight - 2
-            });
-            result.Add(new CanvasPosition
-            {
-                Left = 0.1*ActualWidth +2,
-                Top = 0,
-                Width = 0.5* ActualWidth -4,
-                Height = ActualHeight,
-            });
-
-            result.Add(new CanvasPosition
-            {
-                Left = 0.6*ActualWidth+2,
-                Top = 0,
-                Width = 0.4*ActualWidth-2,
-                Height = 0.5 * ActualHeight - 2
-            });
-
-            result.Add(new CanvasPosition
-            {
-                Left = 0,
-                Top = 0.5*ActualHeight+2,
-                Width = 0.1 * ActualWidth - 2,
-                Height = 0.5 * ActualHeight - 2
-            });
-
-            result.Add(new CanvasPosition
-            {
-                Left = 0.6 * ActualWidth + 2,
-                Top = 0.5 * ActualHeight + 2,
-                Width = 0.4 * ActualWidth - 2,
-                Height = 0.5 * ActualHeight - 2
-            });
-
-            return result;
-        }
-
-        private void UserControl_Loaded(object sender, RoutedEventArgs e)
-        {
-            List<CanvasPosition> pos = InitGridSize();
-            ProgramList programList = new ProgramList();
-            InnerWindow p = new InnerWindow(pos[0])
-            {
-                Title = "绋嬪簭鍒楄〃",
-                Content = programList
-            };
-            HandleInnerWindow(p);
-
-            InnerWindow p1 = new InnerWindow(pos[1])
-            {
-                Title = "鍥剧墖",
-            };
-            HandleInnerWindow(p1);
-
-            SequnceList sequnceList = new SequnceList();
-            programList.ProgramChanged += sequnceList.Selected_Program_Changed;
-
-            InnerWindow p2 = new InnerWindow(pos[2])
-            {
-                Title = "搴忓垪",
-                Content = sequnceList
-            };
-            HandleInnerWindow(p2);
-
-            FunctionSetting functionSetting = new FunctionSetting();
-            InnerWindow p3 = new InnerWindow(pos[3])
-            {
-                Title = "鍑芥暟",
-                Content = functionSetting
-            };
-            HandleInnerWindow(p3);
-
-            StepSetting stepSetting = new StepSetting();
-            InnerWindow p4 = new InnerWindow(pos[4])
-            {
-                Title = "鍗曟璁剧疆",
-                Content = stepSetting
-            };
-            HandleInnerWindow(p4);
-
-
-            SizeChanged += WorkControl_SizeChanged;
-            Loaded -= UserControl_Loaded;
-
-        }
-
-        private void HandleInnerWindow(InnerWindow inner)
-        {
-            inner.MinEvent += InnerWindowMin;
-            inner.MaxEvent += InnerWindowMax;
-            inner.ZIndexEvent += Inner_ZIndexEvent;
-            inner.AttachToCanvas(WorkArea);
-        }
-
-        private void Inner_ZIndexEvent(object sender, EventArgs e)
-        {
-            CanvasHelper.SetTopZIndex(sender as InnerWindow, WorkArea, typeof(InnerWindow));
-        }
-
-        private void HandleMinInnerWindow(InnerWindow inner)
-        {
-            MinInnerWindow min = new MinInnerWindow(inner);
-            min.MaxEvent += MinInnerWindowMax;
-            min.CloseEvent += MinInnerWindowClose;
-            BottomBar.AddMinWindow(min);
-        }
-
-        private void InnerWindowMin(object sender, System.EventArgs e)
-        {
-            InnerWindow inner = sender as InnerWindow;
-            inner.Visibility = Visibility.Collapsed;
-            HandleMinInnerWindow(inner);
-        }
-
-        private void InnerWindowMax(object sender, System.EventArgs e)
-        {
-            InnerWindow inner = sender as InnerWindow;
-            if (inner.WindowState == WindowState.Maximized)
-            {
-                Canvas.SetLeft(inner, inner.canvasPosition.Left);
-                Canvas.SetTop(inner, inner.canvasPosition.Top);
-
-                inner.Width = inner.canvasPosition.Width;
-                inner.Height = inner.canvasPosition.Height;
-                inner.WindowState = WindowState.Normal;
-            }
-            else{
-                Canvas.SetLeft(inner, 0);
-                Canvas.SetTop(inner, 0);
-                inner.Width = WorkArea.ActualWidth;
-                inner.Height = WorkArea.ActualHeight;
-                inner.WindowState = WindowState.Maximized;
-            }
-        }
-
-        private void MinInnerWindowMax(object sender, System.EventArgs e)
-        {
-            MinInnerWindow min = sender as MinInnerWindow;
-            min.Inner.Visibility = Visibility.Visible;
-            BottomBar.RemoveMinWindow(min);
-        }
-
-        private void MinInnerWindowClose(object sender, System.EventArgs e)
-        {
-            MinInnerWindow min = sender as MinInnerWindow;
-            BottomBar.RemoveMinWindow(min);
-        }
-
-
-        private void WorkControl_SizeChanged(object sender, SizeChangedEventArgs e)
-        {
-            Size newSize = e.NewSize;
-            Size previousSize = e.PreviousSize;
-
-            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(WorkArea); i++)
-            {
-                UIElement child = VisualTreeHelper.GetChild(WorkArea, i) as UIElement;
-                if (Canvas.GetLeft(child) >= newSize.Width)
-                {
-                    Canvas.SetLeft(child, Canvas.GetLeft(child) + newSize.Width - previousSize.Width);
-                }
-                if (Canvas.GetTop(child) >= newSize.Height)
-                {
-                    Canvas.SetTop(child, Canvas.GetTop(child) + newSize.Height - previousSize.Height);
-                }
-            }
-        }
-
-
-        public void OnTabChange(object sender, SelectionChangedEventArgs args)
-        {
-            if (args.AddedItems.Count > 0)
-            {
-                IconTabItem newTab = args.AddedItems[0] as IconTabItem;
-                if (newTab != null && newTab.Content == this)
-                { 
-                    
-                }
-            }
-
-            if (args.RemovedItems.Count > 0)
-            {
-                IconTabItem oldTab = args.RemovedItems[0] as IconTabItem;
-                if (oldTab != null && oldTab.Content == this)
-                {
-
-                }
-            }
-        }
-    }
-}
+锘縰sing System;
+using System.Collections.Generic;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Media;
+using WPFProject.Controls;
+using WPFProject.Models;
+using WPFProject.UI.Test;
+using WPFProject.Utils;
+
+namespace WPFProject.UI
+{
+    /// <summary>
+    /// WorkControl.xaml 鐨勪氦浜掗�昏緫
+    /// </summary>
+    public partial class WorkControl : UserControl, IPlugin
+    {
+        public WorkControl()
+        {
+            InitializeComponent();
+            Loaded += UserControl_Loaded;
+        }
+
+        private List<CanvasPosition> InitGridSize()
+        {
+            List<CanvasPosition> result = new List<CanvasPosition>();
+            result.Add(new CanvasPosition
+            {
+                Left = 0,
+                Top = 0,
+                Width = 0.1 * ActualWidth - 2,
+                Height = 0.5 * ActualHeight - 2
+            });
+            result.Add(new CanvasPosition
+            {
+                Left = 0.1 * ActualWidth + 2,
+                Top = 0,
+                Width = 0.5 * ActualWidth - 4,
+                Height = ActualHeight,
+            });
+
+            result.Add(new CanvasPosition
+            {
+                Left = 0.6 * ActualWidth + 2,
+                Top = 0,
+                Width = 0.4 * ActualWidth - 2,
+                Height = 0.5 * ActualHeight - 2
+            });
+
+            result.Add(new CanvasPosition
+            {
+                Left = 0,
+                Top = 0.5 * ActualHeight + 2,
+                Width = 0.1 * ActualWidth - 2,
+                Height = 0.5 * ActualHeight - 2
+            });
+
+            result.Add(new CanvasPosition
+            {
+                Left = 0.6 * ActualWidth + 2,
+                Top = 0.5 * ActualHeight + 2,
+                Width = 0.4 * ActualWidth - 2,
+                Height = 0.5 * ActualHeight - 2
+            });
+
+            return result;
+        }
+
+        private void UserControl_Loaded(object sender, RoutedEventArgs e)
+        {
+            List<CanvasPosition> pos = InitGridSize();
+            ProgramList programList = new ProgramList();
+            InnerWindow p = new InnerWindow(pos[0])
+            {
+                Title = "绋嬪簭鍒楄〃",
+                Content = programList
+            };
+            HandleInnerWindow(p);
+
+            InnerWindow p1 = new InnerWindow(pos[1])
+            {
+                Title = "鍥剧墖",
+            };
+            HandleInnerWindow(p1);
+
+            SequnceList sequnceList = new SequnceList();
+            programList.ProgramChanged += sequnceList.Selected_Program_Changed;
+
+            InnerWindow p2 = new InnerWindow(pos[2])
+            {
+                Title = "搴忓垪",
+                Content = sequnceList
+            };
+            HandleInnerWindow(p2);
+
+            FunctionSetting functionSetting = new FunctionSetting();
+            InnerWindow p3 = new InnerWindow(pos[3])
+            {
+                Title = "鍑芥暟",
+                Content = functionSetting
+            };
+            HandleInnerWindow(p3);
+
+            StepSetting stepSetting = new StepSetting();
+            InnerWindow p4 = new InnerWindow(pos[4])
+            {
+                Title = "鍗曟璁剧疆",
+                Content = stepSetting
+            };
+            HandleInnerWindow(p4);
+
+
+            SizeChanged += WorkControl_SizeChanged;
+            Loaded -= UserControl_Loaded;
+
+        }
+
+        public int CanvasChildrenCount { get; private set; } = 0;
+
+        #region InnerWindow鎿嶄綔閫昏緫
+        /// <summary>
+        /// 璁剧疆InnerWindow
+        /// </summary>
+        /// <param name="inner"></param>
+        private void HandleInnerWindow(InnerWindow inner)
+        {
+            inner.MinEvent += InnerWindowMin;
+            inner.MaxEvent += InnerWindowMax;
+            inner.ZIndexEvent += Inner_ZIndexEvent;
+            inner.GotFocus += Inner_GotFocus;
+            inner.AttachToCanvas(WorkArea);
+            inner.Zindex = CanvasChildrenCount++;
+        }
+
+        /// <summary>
+        /// InnerWindow鐒︾偣浜嬩欢
+        /// </summary>
+        /// <param name="sender"></param>
+        /// <param name="e"></param>
+        private void Inner_GotFocus(object sender, RoutedEventArgs e)
+        {
+            CanvasHelper.SetTopZIndex(sender as InnerWindow, WorkArea, typeof(InnerWindow));
+        }
+
+        /// <summary>
+        /// InnerWindow ZIndex鍒囨崲浜嬩欢
+        /// </summary>
+        /// <param name="sender"></param>
+        /// <param name="e"></param>
+        private void Inner_ZIndexEvent(object sender, EventArgs e)
+        {
+            CanvasHelper.SetTopZIndex(sender as InnerWindow, WorkArea, typeof(InnerWindow));
+        }
+
+        /// <summary>
+        /// InnerWindow鏈�灏忓寲浜嬩欢
+        /// </summary>
+        /// <param name="sender"></param>
+        /// <param name="e"></param>
+        private void InnerWindowMin(object sender, System.EventArgs e)
+        {
+            InnerWindow inner = sender as InnerWindow;
+            inner.Visibility = Visibility.Collapsed;
+            HandleMinInnerWindow(inner);
+        }
+
+        /// <summary>
+        /// InnerWindow鏈�澶у寲浜嬩欢
+        /// </summary>
+        /// <param name="sender"></param>
+        /// <param name="e"></param>
+        private void InnerWindowMax(object sender, System.EventArgs e)
+        {
+            InnerWindow inner = sender as InnerWindow;
+            if (inner.WindowState == WindowState.Maximized)
+            {
+                Canvas.SetLeft(inner, inner.canvasPosition.Left);
+                Canvas.SetTop(inner, inner.canvasPosition.Top);
+
+                inner.Width = inner.canvasPosition.Width;
+                inner.Height = inner.canvasPosition.Height;
+                inner.WindowState = WindowState.Normal;
+            }
+            else
+            {
+                Canvas.SetLeft(inner, 0);
+                Canvas.SetTop(inner, 0);
+                inner.Width = WorkArea.ActualWidth;
+                inner.Height = WorkArea.ActualHeight;
+                inner.WindowState = WindowState.Maximized;
+            }
+        }
+
+        /// <summary>
+        /// 閲嶈澶у皬
+        /// </summary>
+        /// <param name="sender"></param>
+        /// <param name="e"></param>
+        private void WorkControl_SizeChanged(object sender, SizeChangedEventArgs e)
+        {
+            //Size newSize = e.NewSize;
+            //Size previousSize = e.PreviousSize;
+
+            //double xRate = newSize.Width / previousSize.Width;
+            //double yRate = newSize.Height / previousSize.Height;
+            //for (int i = 0; i < VisualTreeHelper.GetChildrenCount(WorkArea); i++)
+            //{
+            //    UIElement child = VisualTreeHelper.GetChild(WorkArea, i) as UIElement;
+            //    Canvas.SetLeft(child, Canvas.GetLeft(child) * xRate);
+            //    Canvas.SetTop(child, Canvas.GetTop(child) * yRate);
+            //}
+
+            //for (int i = 0; i < VisualTreeHelper.GetChildrenCount(WorkArea); i++)
+            //{
+            //    UIElement child = VisualTreeHelper.GetChild(WorkArea, i) as UIElement;
+            //    if (Canvas.GetLeft(child) >= newSize.Width)
+            //    {
+            //        Canvas.SetLeft(child, Canvas.GetLeft(child) + newSize.Width - previousSize.Width);
+            //    }
+            //    if (Canvas.GetTop(child) >= newSize.Height)
+            //    {
+            //        Canvas.SetTop(child, Canvas.GetTop(child) + newSize.Height - previousSize.Height);
+            //    }
+            //}
+        }
+        #endregion
+
+        #region 搴曢儴MinInnerWindow鐩稿叧
+        /// <summary>
+        /// 搴曢儴MinInnerWindow澶勭悊
+        /// </summary>
+        /// <param name="inner"></param>
+        private void HandleMinInnerWindow(InnerWindow inner)
+        {
+            MinInnerWindow min = new MinInnerWindow(inner);
+            min.MaxEvent += MinInnerWindowMax;
+            min.CloseEvent += MinInnerWindowClose;
+            BottomBar.AddMinWindow(min);
+        }
+
+        /// <summary>
+        /// 搴曢儴MinInnerWindow灞曞紑
+        /// </summary>
+        /// <param name="sender"></param>
+        /// <param name="e"></param>
+        private void MinInnerWindowMax(object sender, System.EventArgs e)
+        {
+            MinInnerWindow min = sender as MinInnerWindow;
+            min.Inner.Visibility = Visibility.Visible;
+            CanvasHelper.SetTopZIndex(min.Inner, WorkArea, typeof(InnerWindow));
+            BottomBar.RemoveMinWindow(min);
+        }
+
+        /// <summary>
+        /// 搴曢儴MinInnerWin鍏抽棴
+        /// </summary>
+        /// <param name="sender"></param>
+        /// <param name="e"></param>
+        private void MinInnerWindowClose(object sender, System.EventArgs e)
+        {
+            MinInnerWindow min = sender as MinInnerWindow;
+            BottomBar.RemoveMinWindow(min);
+        }
+        #endregion
+
+        public void OnTabChange(object sender, SelectionChangedEventArgs args)
+        {
+            if (args.AddedItems.Count > 0)
+            {
+                IconTabItem newTab = args.AddedItems[0] as IconTabItem;
+                if (newTab != null && newTab.Content == this)
+                {
+
+                }
+            }
+
+            if (args.RemovedItems.Count > 0)
+            {
+                IconTabItem oldTab = args.RemovedItems[0] as IconTabItem;
+                if (oldTab != null && oldTab.Content == this)
+                {
+
+                }
+            }
+        }
+    }
+}
\ No newline at end of file

--
Gitblit v1.9.1