chenghaoran
2024-02-21 3b877b5501c3c0e4ccb7e4cfd37ddae60f670e4f
Utils/Resize.cs
@@ -6,6 +6,8 @@
using System.Windows.Media;
using System;
using System.Windows.Shapes;
using WPFProject.Controls;
using System.Xml.Linq;
namespace WPFProject.Utils
{
@@ -107,6 +109,18 @@
        static readonly DependencyProperty ResizeableProperty =
           DependencyProperty.RegisterAttached("Resizeable", typeof(Resizeable), typeof(Resize), new PropertyMetadata(null));
        static int i = 0;
        static SolidColorBrush[] colors = new SolidColorBrush[] {
            new SolidColorBrush(Colors.White),
            new SolidColorBrush(Colors.Red),
            new SolidColorBrush(Colors.Blue),
            new SolidColorBrush(Colors.Green),
            new SolidColorBrush(Colors.LightBlue),
            new SolidColorBrush(Colors.Orange),
            new SolidColorBrush(Colors.Yellow),
            new SolidColorBrush(Colors.Black),
        };
        public class Resizeable
        {
            ResizeType _resizeType;
@@ -140,22 +154,32 @@
                    _thumbsParent = VisualTreeHelper.GetChild(thumbsRoot, 0) as FrameworkElement;
                }
                if (thumbsRoot != null)
                {
                    UIElement target = _resizeTarget is Window _windowTarget ? _windowTarget.Content as UIElement : _resizeTarget;
                    if (target != null)
                    UIElement element = _resizeTarget is Window _windowTarget ? _windowTarget.Content as UIElement : _resizeTarget;
                    if (element != null)
                    {
                        AdornerLayer layer = AdornerLayer.GetAdornerLayer(target);
                        if (layer == null) throw new Exception("获取控件装饰层失败,控件可能没有装饰层!");
                        layer.Add(new ResizeAdorner(target, thumbsRoot));
                        if (element is InnerWindow _inner)
                        {
                            AdornerLayer layer = _inner.ResizeAdornerDecorator.AdornerLayer;
                            if (layer == null)
                                throw new Exception("获取控件装饰层失败,控件可能没有装饰层!");
                            layer.Add(new ResizeAdorner(layer, thumbsRoot));
                        }
                        else
                        {
                            AdornerLayer layer = AdornerLayer.GetAdornerLayer(element);
                            if (layer == null)
                                throw new Exception("获取控件装饰层失败,控件可能没有装饰层!");
                            layer.Add(new ResizeAdorner(element, thumbsRoot));
                        }
                    }
                }
                // 使用缺省样式
                if (thumbsRoot == null)
                {
                    Thumb leftThumb = null, topThumb = null, rightThumb = null, bottomThumb = null,
                    Thumb leftThumb = null, topThumb = null, rightThumb = null, bottomThumb = null,
                        lefTopThumb = null, rightTopThumb = null, rightBottomThumb = null, leftbottomThumb = null;
                    int thumnSize = 5;
                    // 初始化thumb
@@ -251,6 +275,7 @@
                    leftbottomThumb.Width = thumnSize;
                    leftbottomThumb.Height = thumnSize;
                    Grid grid = new Grid();
                    grid.Children.Add(leftThumb);
                    grid.Children.Add(topThumb);
@@ -271,10 +296,20 @@
                    }
                    if (element != null)
                    {
                        var layer = AdornerLayer.GetAdornerLayer(element);
                        if (layer == null)
                            throw new Exception("获取控件装饰层失败,控件可能没有装饰层!");
                        layer.Add(new ResizeAdorner(element, grid));
                        if (element is InnerWindow _inner)
                        {
                            AdornerLayer layer = _inner.ResizeAdornerDecorator.AdornerLayer;
                            if (layer == null)
                                throw new Exception("获取控件装饰层失败,控件可能没有装饰层!");
                            layer.Add(new ResizeAdorner(layer, grid));
                        }
                        else
                        {
                            AdornerLayer layer = AdornerLayer.GetAdornerLayer(element);
                            if (layer == null)
                                throw new Exception("获取控件装饰层失败,控件可能没有装饰层!");
                            layer.Add(new ResizeAdorner(element, grid));
                        }
                    }
                    thumbsRoot = grid;
                    _thumbsParent = thumbsRoot;
@@ -308,12 +343,13 @@
            private void Thumb_DragStarted(object sender, DragStartedEventArgs e)
            {
                _resizeType = GetResizeType();
                if (_resizeType == ResizeType.Canvas)
                if (_resizeType == ResizeType.Canvas && _resizeTarget is InnerWindow _inner)
                {
                    Canvas parent = GetCanvas(_resizeTarget);
                    CanvasHelper.SetTopZIndex(_resizeTarget, parent, _resizeTarget.GetType());
                    Canvas parent = GetCanvas(_inner);
                    CanvasHelper.SetTopZIndex(_inner, parent, _inner.GetType());
                }
            }
            private void Thumb_DragDelta(object sender, DragDeltaEventArgs e)
            {
                switch (_resizeType)
@@ -369,7 +405,7 @@
                        }
                        break;
                    case ResizeType.Canvas:
                        {
                        {
                            FrameworkElement target = _resizeTarget;
                            Canvas parent = GetCanvas(target);
                            FrameworkElement thumb = sender as FrameworkElement;
@@ -501,7 +537,7 @@
            }
            // 装饰器
            class ResizeAdorner : Adorner
            public class ResizeAdorner : Adorner
            {
                // 布局容器,如果不使用布局容器,则需要给上述8个控件布局,实现和Grid布局定位是一样的,会比较繁琐且意义不大。
                UIElement _child;
@@ -522,6 +558,17 @@
                    _child.Arrange(new Rect(new Point(0, 0), finalSize));
                    return finalSize;
                }
                public void ttt(int index)
                {
                    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(_child); i++)
                    {
                        DependencyObject child = VisualTreeHelper.GetChild(_child, i);
                        Canvas.SetZIndex(child as UIElement, index);
                    }
                }
            }
        }