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:
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;
}
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER