编写VisualHelper
This commit is contained in:
		@@ -11,25 +11,30 @@ namespace Deedy.Activity
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public enum DropPlacement : int
 | 
			
		||||
    {
 | 
			
		||||
        UnDragged = 0,
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 不确定的
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Uncertain=0,
 | 
			
		||||
        Uncertain = 1,
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 拒绝放置
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Rejected = 0,
 | 
			
		||||
        Rejected = 2,
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 在节点前
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        BeforeMe = 1,
 | 
			
		||||
        BeforeMe = 3,
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 在节点内
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        WithinMe = 2,
 | 
			
		||||
        WithinMe = 4,
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 在节点后
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        BehindMe = 3,
 | 
			
		||||
        BehindMe = 5,
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 替换自身
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        ReplaceMe = 6,
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,32 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
namespace Deedy.Activity
 | 
			
		||||
{
 | 
			
		||||
    public enum LayoutDirection
 | 
			
		||||
    {
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 不可布局
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Cannot,
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 只有唯一子节点
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Decorator,
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 上下叠放
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Stacked,
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 从左向右
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Horizontal,
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 从上到下
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Vertical,
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -6,7 +6,7 @@ using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
namespace Deedy.Activity
 | 
			
		||||
{
 | 
			
		||||
    public interface IDeedyInput
 | 
			
		||||
    public interface IVisualInput
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -6,8 +6,8 @@ using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
namespace Deedy.Activity
 | 
			
		||||
{
 | 
			
		||||
    public interface IDeedyLayout : IContainerElement
 | 
			
		||||
    public interface IVisualLayout : IContainerElement
 | 
			
		||||
    {
 | 
			
		||||
        
 | 
			
		||||
        LayoutDirection LayoutDirection { get; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -6,7 +6,7 @@ using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
namespace Deedy.Activity
 | 
			
		||||
{
 | 
			
		||||
    public class IDeedyViewer
 | 
			
		||||
    public class IVisualViewer
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -10,10 +10,10 @@ using System.Windows;
 | 
			
		||||
 | 
			
		||||
namespace Deedy.Activity
 | 
			
		||||
{
 | 
			
		||||
    public class DeedyLayout : IDeedyLayout
 | 
			
		||||
    public class VisualLayout : IVisualLayout
 | 
			
		||||
    {
 | 
			
		||||
        public ExpandoMapping ExpandoMapping { get; set; } = new ExpandoMapping();
 | 
			
		||||
        public DeedyLayout() { }
 | 
			
		||||
        public VisualLayout() { }
 | 
			
		||||
        public string Class { get; protected internal set; } = "";
 | 
			
		||||
        public string Title { get; set; } = "";
 | 
			
		||||
        public string Remark { get; set; } = "";
 | 
			
		||||
@@ -29,6 +29,8 @@ namespace Deedy.Activity
 | 
			
		||||
 | 
			
		||||
        public ParamDefineCollection ParamsMapping { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
 | 
			
		||||
 | 
			
		||||
        public LayoutDirection LayoutDirection => throw new NotImplementedException();
 | 
			
		||||
 | 
			
		||||
        public event PropertyChangedEventHandler? PropertyChanged;
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
@@ -3,10 +3,151 @@ using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using System.Windows.Media;
 | 
			
		||||
using System.Windows;
 | 
			
		||||
 | 
			
		||||
namespace Deedy.Activity.Helpers
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// 辅助可视化单元进行相关操作
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public static partial class Helper
 | 
			
		||||
    {
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 辅助可视化单元进行拖放装饰器绘制操作
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="ui">要绘制的「UIElement」元素</param>
 | 
			
		||||
        /// <param name="dc">「UIElement」元素的绘图上下文</param>
 | 
			
		||||
        /// <param name="dropPlacement">拖放操作的放置位置</param>
 | 
			
		||||
        /// <param name="parentLayout">父级布局的布局方向</param>
 | 
			
		||||
        public static void Help_DrawDropAdorner(this UIElement ui, DrawingContext dc, DropPlacement dropPlacement, LayoutDirection parentLayout)
 | 
			
		||||
        {
 | 
			
		||||
            if (ui == null || dc == null || dropPlacement == DropPlacement.UnDragged) return;
 | 
			
		||||
            Pen pen = new Pen(Brushes.Red, 3);
 | 
			
		||||
            pen.Freeze();
 | 
			
		||||
 | 
			
		||||
            switch (dropPlacement)
 | 
			
		||||
            {
 | 
			
		||||
                case DropPlacement.Rejected:
 | 
			
		||||
                    {
 | 
			
		||||
                        
 | 
			
		||||
                    }
 | 
			
		||||
                    break;
 | 
			
		||||
                case DropPlacement.Uncertain:
 | 
			
		||||
                    {
 | 
			
		||||
                        
 | 
			
		||||
                    }
 | 
			
		||||
                    break;
 | 
			
		||||
                case DropPlacement.BeforeMe:
 | 
			
		||||
                    {
 | 
			
		||||
                        if (parentLayout == LayoutDirection.Horizontal)
 | 
			
		||||
                        {
 | 
			
		||||
                        }
 | 
			
		||||
                        else if (parentLayout == LayoutDirection.Vertical)
 | 
			
		||||
                        {
 | 
			
		||||
                        }
 | 
			
		||||
                        else if (parentLayout == LayoutDirection.Stacked)
 | 
			
		||||
                        {
 | 
			
		||||
                        }
 | 
			
		||||
                        else { }
 | 
			
		||||
                    }
 | 
			
		||||
                    break;
 | 
			
		||||
                case DropPlacement.BehindMe:
 | 
			
		||||
                    {
 | 
			
		||||
                        if (parentLayout == LayoutDirection.Horizontal)
 | 
			
		||||
                        {
 | 
			
		||||
                        }
 | 
			
		||||
                        else if (parentLayout == LayoutDirection.Vertical)
 | 
			
		||||
                        {
 | 
			
		||||
                        }
 | 
			
		||||
                        else if (parentLayout == LayoutDirection.Stacked)
 | 
			
		||||
                        {
 | 
			
		||||
                        }
 | 
			
		||||
                        else { }
 | 
			
		||||
                    }
 | 
			
		||||
                    break;
 | 
			
		||||
                case DropPlacement.WithinMe:
 | 
			
		||||
                    {
 | 
			
		||||
                    }
 | 
			
		||||
                    break;
 | 
			
		||||
                case DropPlacement.ReplaceMe:
 | 
			
		||||
                    {
 | 
			
		||||
                    }
 | 
			
		||||
                    break;
 | 
			
		||||
                default: break;                 //DropPlacement.UnDragged;不需要绘制任何图样
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 检查拖放操作的模式
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="ui">要检查的「UIElement」元素</param>
 | 
			
		||||
        /// <param name="point">检查点位置</param>
 | 
			
		||||
        /// <returns>检查后的拖放位置;其中不包括「DropPlacement.UnDragged」与「DropPlacement.Uncertain」</returns>
 | 
			
		||||
        /// <remarks>
 | 
			
		||||
        /// <para>「DropPlacement.UnDragged」= 未在拖放状态</para>
 | 
			
		||||
        /// <para>「DropPlacement.Uncertain」= 拖放内容不是可视化元素</para>
 | 
			
		||||
        /// <para>··以上两种情况需要在调用此方法前进行判定</para>
 | 
			
		||||
        /// </remarks>
 | 
			
		||||
        public static DropPlacement Help_CheckDropPlacement(this UIElement ui, Point point)
 | 
			
		||||
        {
 | 
			
		||||
            DropPlacement result = DropPlacement.UnDragged;
 | 
			
		||||
            if (ui != null)
 | 
			
		||||
            {
 | 
			
		||||
                Size size = ui.RenderSize;
 | 
			
		||||
                double horRuler = size.Width / 3;
 | 
			
		||||
                if (horRuler > 20) horRuler = 20;
 | 
			
		||||
                double verRuler = size.Height / 3;
 | 
			
		||||
                if (verRuler > 20) verRuler = 20;
 | 
			
		||||
                LayoutDirection direction = LayoutDirection.Cannot;
 | 
			
		||||
                if (ui is IVisualLayout layout)
 | 
			
		||||
                {
 | 
			
		||||
                    if (ui is FrameworkElement fe && fe.Parent is IVisualLayout parentLayout)
 | 
			
		||||
                    {
 | 
			
		||||
                        direction = parentLayout.LayoutDirection;
 | 
			
		||||
                        if (direction == LayoutDirection.Decorator)
 | 
			
		||||
                        {
 | 
			
		||||
                            if (point.X < horRuler
 | 
			
		||||
                                || point.Y < verRuler
 | 
			
		||||
                                || size.Width - point.X < horRuler
 | 
			
		||||
                                || size.Height - point.Y < verRuler)
 | 
			
		||||
                                result = DropPlacement.ReplaceMe;
 | 
			
		||||
                            else result = DropPlacement.WithinMe;
 | 
			
		||||
                        }
 | 
			
		||||
                        else if (direction == LayoutDirection.Cannot)
 | 
			
		||||
                            result = DropPlacement.WithinMe;
 | 
			
		||||
                        else
 | 
			
		||||
                        {
 | 
			
		||||
                            if (point.X < horRuler || point.Y < verRuler)
 | 
			
		||||
                                result = DropPlacement.BeforeMe;
 | 
			
		||||
                            else if (size.Width - point.X < horRuler || size.Height - point.Y < verRuler)
 | 
			
		||||
                                result = DropPlacement.BehindMe;
 | 
			
		||||
                            else result = DropPlacement.WithinMe;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    else result = DropPlacement.WithinMe;
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    if (ui is FrameworkElement fe && fe.Parent is IVisualLayout parentLayout)
 | 
			
		||||
                    {
 | 
			
		||||
                        direction = parentLayout.LayoutDirection;
 | 
			
		||||
                        if (direction == LayoutDirection.Decorator)
 | 
			
		||||
                            result = DropPlacement.ReplaceMe;
 | 
			
		||||
                        else if (direction == LayoutDirection.Cannot)
 | 
			
		||||
                            result = DropPlacement.Rejected;
 | 
			
		||||
                        else
 | 
			
		||||
                        {
 | 
			
		||||
                            if (point.X < horRuler || point.Y < verRuler)
 | 
			
		||||
                                result = DropPlacement.BeforeMe;
 | 
			
		||||
                            else if (size.Width - point.X < horRuler || size.Height - point.Y < verRuler)
 | 
			
		||||
                                result = DropPlacement.BehindMe;
 | 
			
		||||
                            else result = DropPlacement.Rejected;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    else result = DropPlacement.Rejected;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            return result;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -8,5 +8,6 @@ namespace Deedy.Activity
 | 
			
		||||
{
 | 
			
		||||
    public interface IVisualElement : IElement
 | 
			
		||||
    {
 | 
			
		||||
        DropPlacement DropPlacement { get; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user