Your Privacy Matters: We use our own and third-party cookies to improve your experience on our website. By continuing to use the website we understand that you accept their use. Cookie Policy
845
How can I get the actual top left location of a dropped TextBlock.
posted

When I drop a TextBlock onto a Canvas I use the following code:

            var canvas = e.DropTarget as Canvas;
            var draggedElement = e.OriginalDragSource;
 
            FrameworkElement newElement = null;
            if (draggedElement is TextBlock)
            {
                var oldText = draggedElement as TextBlock;
                newElement = new TextBlock
                {
                    Text = oldText.Text,
                    TextWrapping = TextWrapping.Wrap,
                    Height = oldText.ActualHeight,
                    Width = oldText.ActualWidth
                };
            }
 
            canvas.Children.Add(newElement);
            Point dropPoint = e.GetPosition(canvas);
            // Need to get point relative to text as well
            newElement.SetValue(Canvas.TopProperty, dropPoint.Y);
            newElement.SetValue(Canvas.LeftProperty, dropPoint.X);

However, the TextBlock is offset as the drop point is the location of the cursor which may be anywhere along the selected text:

    Text Being Dragged

           ^

The same point is returned whether I pass the Canvas or the TextBlock into e.GetPosition.

Parents
  • 440
    Verified Answer
    posted

    Hi Chris,

    You can handle the TextBlock’s MouseLeftButtonDown event to get the handle point like

    Point handlePoint;

            private void TextBlock_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)

            {

                handlePoint = e.GetPosition(sender as TextBlock);

            }

    Next in your Drop Event you can calculate the position like

    Point dropPoint = e.GetPosition(canvas);

    // Need to get point relative to text as well

    newElement.SetValue(Canvas.TopProperty, dropPoint.Y - handlePoint.Y);

    newElement.SetValue(Canvas.LeftProperty, dropPoint.X - handlePoint.X);

    Best,

    Ivo

Reply Children