0

Silverlight 4 で RichTextBox のドラッグ アンド ドロップ動作がありますが、小さなスナップの問題があります。

ユーザーが RichTextBox の境界線を「つかんで」ドラッグ/ドロップできるようにしたいと思います。RichTextBox は、ユーザーが RichTextBox を「つかんだ」場所を基準にしてドラッグする必要があります。しかし、代わりに、ユーザーがドラッグを開始するとすぐに、RichTextBox は、マウスの位置に相対する位置ではなく、マウスの位置の中央に「スナップ」します。

そこで、以下のように右下隅をつかむと……

https://skydrive.live.com/redir?resid=DCC93DD825EF3F43!658

次のように、ドラッグの開始時にマウス位置の中央に「スナップ」します...

https://skydrive.live.com/redir?resid=DCC93DD825EF3F43!659

これが私のドラッグコードです。私の計算が間違っていると思います (MouseMove イベントで) ???

public class CustomRichTextBox : RichTextBox
{
    private bool isDragging = false;

    protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
    {
        base.OnMouseLeftButtonDown(e);

        bool isDragAllowed = false;
        Point pt = e.GetPosition(this);

        if (pt.Y >= 0 && pt.Y <= this.BorderThickness.Top)
            // Allow dragging if the mouse is down on the top border
            isDragAllowed = true;
        else if (pt.Y >= (this.RenderSize.Height - this.BorderThickness.Bottom) && pt.Y <= this.RenderSize.Height)
            // Allow dragging if the mouse is down on the bottom border
            isDragAllowed = true;
        else if (pt.X >= 0 && pt.X <= this.BorderThickness.Left)
            // Allow dragging if the mouse is down on the left border
            isDragAllowed = true;
        else if (pt.X >= (this.RenderSize.Width - this.BorderThickness.Right) && pt.X <= this.RenderSize.Width)
            // Allow dragging if the mouse is down on the right border
            isDragAllowed = true;

        if (!isDragAllowed)
            return;

        this.CaptureMouse();
        isDragging = true;
    }

    protected override void OnMouseMove(MouseEventArgs e)
    {
        base.OnMouseMove(e);

        if (isDragging)
        {
            CustomRichTextBox elem = this;
            CompositeTransform ct = (CompositeTransform)elem.RenderTransform;
            UIElement parent = (UIElement)elem.Parent;

            ct.TranslateX = e.GetPosition(parent).X - (parent.RenderSize.Width / 2);
            ct.TranslateY = e.GetPosition(parent).Y - (parent.RenderSize.Height / 2);
        }
    }

    protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e)
    {
        base.OnMouseLeftButtonUp(e);

        isDragging = false;
        this.ReleaseMouseCapture();
    }
}
4

0 に答える 0