闽公网安备 35020302035485号
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>
示例效果通过以上实现,就可以将装饰器绑定到控件元素,示例如下所示: