3.在控件上叠加视觉装饰。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Documents; using System.Windows.Media; namespace DemoDragAndDrop.Adorners { /// <summary> /// 堆代码 duidaima.com /// 锚点装饰器 /// </summary> public class AnchorAdorner : Adorner { public AnchorAdorner(UIElement adornedElement) : base(adornedElement) { } protected override void OnRender(DrawingContext drawingContext) { base.OnRender(drawingContext); var size = this.AdornedElement.DesiredSize;//获取需要装饰的UI元素的真实Size Rect rect = new Rect(size);//定义一个矩形,从0,0开始,大小为size var pen = new Pen(Brushes.Black, 2); pen.DashStyle = DashStyles.Solid; //drawingContext.DrawRectangle(Brushes.Transparent, pen, rect);//绘制矩形,第1个参数是填充色,第2个参数是边框,第3个参数是矩形大小,位置 drawingContext.DrawEllipse(Brushes.WhiteSmoke, pen, new Point(0, size.Height / 2), 3, 3);//绘制锚点,左中 drawingContext.DrawEllipse(Brushes.WhiteSmoke, pen, new Point(size.Width, size.Height / 2), 3, 3);//绘制锚点,右中 drawingContext.DrawEllipse(Brushes.WhiteSmoke, pen, new Point(size.Width / 2, 0), 3, 3);//绘制锚点,上中 drawingContext.DrawEllipse(Brushes.WhiteSmoke, pen, new Point(size.Width / 2, size.Height), 3, 3);//绘制锚点,下中 } } }装饰器2,修改大小装饰器,用于提示用户,可以在此位置进行拖动调整控件大小,如下所示:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Documents; using System.Windows.Media; namespace DemoDragAndDrop.Adorners { /// <summary> /// 顶点装饰器 /// </summary> public class RubberAdorner : Adorner { public RubberAdorner(UIElement adornedElement) : base(adornedElement) { } protected override void OnRender(DrawingContext drawingContext) { base.OnRender(drawingContext); var size = this.AdornedElement.DesiredSize;//获取需要装饰的UI元素的真实Size Rect rect = new Rect(size);//定义一个矩形,从0,0开始,大小为size var pen = new Pen(Brushes.Black, 2); pen.DashStyle = DashStyles.Solid; //drawingContext.DrawRectangle(Brushes.Transparent, pen, rect);//绘制矩形,第1个参数是填充色,第2个参数是边框,第3个参数是矩形大小,位置 drawingContext.DrawEllipse(Brushes.WhiteSmoke, pen, rect.TopLeft, 3, 3);//绘制锚点,左上 drawingContext.DrawEllipse(Brushes.WhiteSmoke, pen, rect.TopRight, 3, 3);//绘制锚点,右上 drawingContext.DrawEllipse(Brushes.WhiteSmoke, pen, rect.BottomLeft, 3, 3);//绘制锚点,坐下 drawingContext.DrawEllipse(Brushes.WhiteSmoke, pen, rect.BottomRight, 3, 3);//绘制锚点,右下 } } }将装饰器绑定到元素
private void MouseEnter(object obj) { var element = (UIElement)obj; var adornerLayer = AdornerLayer.GetAdornerLayer(element); Adorner[] adorners = adornerLayer.GetAdorners(element); if (adornerLayer != null && adorners == null) { adornerLayer.Add(new AnchorAdorner(element)); adornerLayer.Add(new RubberAdorner(element)); } }从控件移除装饰器
private void MouseLeave(object obj) { var element = (UIElement)obj; var adornerLayer = AdornerLayer.GetAdornerLayer(element); Adorner[] adorners = adornerLayer.GetAdorners(element); if (adorners != null) { foreach (var adorner in adorners) { adornerLayer.Remove(adorner); } } }UI页面
<Window x:Class="DemoDragAndDrop.TestWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:i="http://schemas.microsoft.com/xaml/behaviors" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:DemoDragAndDrop" mc:Ignorable="d" Title="TestWindow" Height="450" Width="800"> <Grid> <Rectangle Height="100" Stroke="Black" Fill="LightCyan" Width="100"> <i:Interaction.Triggers> <i:EventTrigger EventName="MouseEnter"> <i:InvokeCommandAction Command="{Binding MouseEnterCommand}" CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Rectangle}}"/> </i:EventTrigger> <i:EventTrigger EventName="MouseLeave"> <i:InvokeCommandAction Command="{Binding MouseLeaveCommand}" CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Rectangle}}"/> </i:EventTrigger> </i:Interaction.Triggers> </Rectangle> </Grid> </Window>示例效果
通过以上实现,就可以将装饰器绑定到控件元素,示例如下所示: