<CanvasName="MyCanvas"PreviewMouseLeftButtonDown="MyCanvas_PreviewMouseLeftButtonDown"PreviewMouseMove="MyCanvas_PreviewMouseMove"PreviewMouseLeftButtonUp="MyCanvas_PreviewMouseLeftButtonUp"><RectangleFill="Blue"Height="32"Width="32"Canvas.Top="8"Canvas.Left="8"/><TextBoxText="This is a TextBox. Drag and drop me"Canvas.Top="100"Canvas.Left="100"/></Canvas>
usingSystem;usingSystem.Windows;usingSystem.Windows.Documents;usingSystem.Windows.Media;usingSystem.Windows.Media.Animation;usingSystem.Windows.Shapes;namespaceDragDropObjects{publicclassSimpleCircleAdorner:Adorner{privatereadonlyRectangle _child;privatedouble _leftOffset;privatedouble _topOffset;// Be sure to call the base class constructor.publicSimpleCircleAdorner(UIElement adornedElement):base(adornedElement){var brush =newVisualBrush(adornedElement);
_child =newRectangle{
Width = adornedElement.RenderSize.Width,
Height = adornedElement.RenderSize.Height
};var animation =newDoubleAnimation(0.3,1,newDuration(TimeSpan.FromSeconds(1))){
AutoReverse =true,
RepeatBehavior = RepeatBehavior.Forever
};
brush.BeginAnimation(Brush.OpacityProperty, animation);
_child.Fill = brush;}protectedoverrideint VisualChildrenCount =>1;publicdouble LeftOffset
{get{return _leftOffset;}set{
_leftOffset =value;UpdatePosition();}}publicdouble TopOffset
{get{return _topOffset;}set{
_topOffset =value;UpdatePosition();}}// A common way to implement an adorner's rendering behavior is to override the OnRender// method, which is called by the layout subsystem as part of a rendering pass.protectedoverridevoidOnRender(DrawingContext drawingContext){// Get a rectangle that represents the desired size of the rendered element// after the rendering pass. This will be used to draw at the corners of the // adorned element.var adornedElementRect =newRect(AdornedElement.DesiredSize);// Some arbitrary drawing implements.var renderBrush =newSolidColorBrush(Colors.Green){Opacity =0.2};var renderPen =newPen(newSolidColorBrush(Colors.Navy),1.5);constdouble renderRadius =5.0;// Just draw a circle at each corner.
drawingContext.DrawRectangle(renderBrush, renderPen, adornedElementRect);
drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.TopLeft, renderRadius, renderRadius);
drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.TopRight, renderRadius, renderRadius);
drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.BottomLeft, renderRadius, renderRadius);
drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.BottomRight, renderRadius,
renderRadius);}protectedoverrideSizeMeasureOverride(Size constraint){
_child.Measure(constraint);return _child.DesiredSize;}protectedoverrideSizeArrangeOverride(Size finalSize){
_child.Arrange(newRect(finalSize));return finalSize;}protectedoverrideVisualGetVisualChild(int index)=> _child;privatevoidUpdatePosition(){var adornerLayer = Parent asAdornerLayer;
adornerLayer?.Update(AdornedElement);}publicoverrideGeneralTransformGetDesiredTransform(GeneralTransform transform){var result =newGeneralTransformGroup();
result.Children.Add(base.GetDesiredTransform(transform));
result.Children.Add(newTranslateTransform(_leftOffset, _topOffset));return result;}}}