Link to home
Start Free TrialLog in
Avatar of cardinalone
cardinalone

asked on

WPF: Thumb DragDelta not Working

I wrote a custom adorner for the WPF InkCanvas. It takes over the built-in adorner that InkCanvas provides, and I designed it to do the same things (Select, Resize, Move, etc the adorned elements).

My Thumbs (one on each corner of a Path that has a RectangelGeomoetry locate perfectly when the adorner is added. However, the DragDelta code is not operating correctly. I'll use the TopLeft THumb as the example. As I click on the Thumb and drag it, the Thumb lags about 50-100 pixels behind the mouse point. After I let go, it places correctly, But when I select it again, it bounces back to the TopLeft corner briefly before it starts tracking.

FYI- The Thumbs are in the Adorner layer (they are not children on the InkCanvas).

Here is the code:
// Handler for thumb dragging
    void ThumbPointAdorner_OnDragDelta(object sender, DragDeltaEventArgs args)
    {
      FrameworkElement adornedElement = this.AdornedElement as FrameworkElement;
      Thumb movingThumb = sender as Thumb;

      if (adornedElement == null || movingThumb == null) return;

        {      

            if ((Math.Abs(args.HorizontalChange) > 0) || (Math.Abs(args.VerticalChange) > 0))
            {
                Rect rect = new Rect( (movingThumb as FrameworkElement).DesiredSize);

                rect.Offset(args.HorizontalChange, args.VerticalChange);

                movingThumb.Arrange(rect);
                this.UpdateLayout();
                parentElement.UpdateLayout();

            }
  
        }
    }
   
 // Arrange the Adorners.

    protected override Size ArrangeOverride(Size finalSize)
    {

      // desiredWidth and desiredHeight are the width and height of the element that's being adorned.  
      // These will be used to place the ResizingAdorner at the corners of the adorned element.  
      double desiredWidth  = _adornedElement.DesiredSize.Width;
      double desiredHeight = _adornedElement.DesiredSize.Height;

        // adornerWidth & adornerHeight are used for placement as well.
      double adornerWidth = this.DesiredSize.Width;
      double adornerHeight = this.DesiredSize.Height;

          Point topLeftPoint = new Point( InkCanvas.GetLeft(_adornedElement),
                                   InkCanvas.GetTop(_adornedElement));
                        
          IDictionary<string, Point> points = Helper.GetFourPoints(adornerHeight,
                                                            adornerWidth, 
                                                            new Point(0,0));

//        TopLeftPoint
//        TopRightPoint
//        BottomLeftPoint
//        BottomRightPoint

      {
            //_thumbs[0].Arrange( new Rect( points["TopLeftPoint"], _thumbs[0].DesiredSize));
            //_thumbs[1].Arrange( new Rect( points["TopRightPoint"], _thumbs[1].DesiredSize));
            //_thumbs[2].Arrange( new Rect( points["BottomLeftPoint"], _thumbs[2].DesiredSize));
            //_thumbs[3].Arrange(new Rect(points["BottomRightPoint"], _thumbs[3].DesiredSize));

          Size outlineSize = new Size(_adornedElement.DesiredSize.Width , _adornedElement.DesiredSize.Height );

          Rect _adornedElementRect = new Rect(outlineSize);
            
            _adornerOutline.Data = new RectangleGeometry(_adornedElementRect);
            _adornerOutline.Arrange(new Rect(outlineSize));

            _thumbs[0].Arrange( new Rect(points["TopLeftPoint"],  finalSize));
            _thumbs[1].Arrange(new Rect(points["TopRightPoint"], finalSize));
            _thumbs[2].Arrange(new Rect(points["BottomLeftPoint"], finalSize));
            _thumbs[3].Arrange(new Rect(points["BottomRightPoint"], finalSize));

      }
      // Return the final size.
      return finalSize;
    }

Open in new window

ASKER CERTIFIED SOLUTION
Avatar of Kumaraswamy R
Kumaraswamy R
Flag of India image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of cardinalone
cardinalone

ASKER

Thanks for the link,. it re-pointed my efforts. I also found a bug in my code that also was part of the solution.