Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 拖放文本框?_C#_Wpf_Textbox_Winrt Xaml_Uwp - Fatal编程技术网

C# 拖放文本框?

C# 拖放文本框?,c#,wpf,textbox,winrt-xaml,uwp,C#,Wpf,Textbox,Winrt Xaml,Uwp,在我的通用Windows应用程序中,我有一个拖放界面,用户可以在图像中添加一个文本框,并对其进行拖动和缩放,就像它是MSPaint中的一个文本框一样,但在放置后可以通过双击来编辑它 我已实施了以下措施: textBox.LostFocus设置textBox.IsReadOnly=true; textBox.DoubleTapped集只读回false,以便可以四处拖动。 textBox.ManipulationDelta将文本框四处移动 现在我有一个问题,文本框有这种橡皮键效果,这会阻止操纵事件

在我的通用Windows应用程序中,我有一个拖放界面,用户可以在图像中添加一个文本框,并对其进行拖动和缩放,就像它是MSPaint中的一个文本框一样,但在放置后可以通过双击来编辑它

我已实施了以下措施:

textBox.LostFocus设置textBox.IsReadOnly=true; textBox.DoubleTapped集只读回false,以便可以四处拖动。 textBox.ManipulationDelta将文本框四处移动

现在我有一个问题,文本框有这种橡皮键效果,这会阻止操纵事件

有没有办法禁用此功能?或者我可以举例说,当鼠标点击或手指或其他什么,它应该启动操作事件

新文本框的代码:

对焦和离焦代码:

private void TextBoxOnDoubleTapped(object sender, DoubleTappedRoutedEventArgs doubleTappedRoutedEventArgs)
{
    (sender as TextBox).IsReadOnly = false;
}

private void TextBoxOnLostFocus(object sender, RoutedEventArgs routedEventArgs)
{
    (sender as TextBox).IsReadOnly = true;
}
操纵代码:

private void OnManipulationStarted(object sender, ManipulationStartedRoutedEventArgs e)
{
    if (sender is TextBox)
        (sender as TextBox).IsReadOnly = true;
    ((FrameworkElement)sender).Opacity = 0.6;
}

private void OnManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
{
    var frameworkElement = (FrameworkElement)sender;
    var transform = (CompositeTransform)frameworkElement.RenderTransform;

    // LEFT-RIGHT bounds
    if (e.Delta.Translation.X < 0) // Going left
    {
        if (DrawingArea.ActualWidth / 2 + (transform.TranslateX + e.Delta.Translation.X) - frameworkElement.ActualWidth / 2 > 0)
        {
            // Staying inside, apply translation
            transform.TranslateX += e.Delta.Translation.X;
        }
        else
        {
            // Trying to go outside, because scale sucks to work with, move image back inside
            transform.TranslateX = frameworkElement.ActualWidth / 2 - DrawingArea.ActualWidth / 2;
        }
    }
    else // Going right
    {
        if (DrawingArea.ActualWidth / 2 - (transform.TranslateX + e.Delta.Translation.X) +
            frameworkElement.ActualWidth * (0.5 - transform.ScaleX) > 0)
        {
            // Staying inside, apply translation
            transform.TranslateX += e.Delta.Translation.X;
        }
        else
        {
            // Trying to go outside, because scale sucks to work with, move image back inside
            transform.TranslateX = frameworkElement.ActualWidth * (0.5 - transform.ScaleX) + DrawingArea.ActualWidth / 2;
        }
    }

    // UP-DOWN bounds
    if (e.Delta.Translation.Y < 0) // Going up
    {
        if (DrawingArea.ActualHeight / 2 + (transform.TranslateY + e.Delta.Translation.Y) - frameworkElement.ActualHeight / 2 >
            0)
        {
            // Staying inside, apply translation
            transform.TranslateY += e.Delta.Translation.Y;
        }
        else
        {
            // Trying to go outside, because scale sucks to work with, move image back inside
            transform.TranslateY = frameworkElement.ActualHeight / 2 - DrawingArea.ActualHeight / 2;
        }
    }
    else // Going down
    {
        if (DrawingArea.ActualHeight / 2 - (transform.TranslateY + e.Delta.Translation.Y) +
            frameworkElement.ActualHeight * (0.5 - transform.ScaleY) > 0)
        {
            // Staying inside, apply translation
            transform.TranslateY += e.Delta.Translation.Y;
        }
        else
        {
            // Trying to go outside, because scale sucks to work with, move image back inside
            // transform.TranslateY = image.ActualHeight*(0.5 - transform.ScaleY) + DrawingArea.ActualHeight/2;

            // Dragging down, remove image
            DrawingArea.Children.Remove(frameworkElement);
        }
    }

    // Only allow scaling when both dimensions are smaller than the drawingarea
    if (frameworkElement.ActualHeight * (transform.ScaleY * e.Delta.Scale) < DrawingArea.ActualHeight &&
        frameworkElement.ActualWidth * (transform.ScaleX * e.Delta.Scale) < DrawingArea.ActualWidth)
    {
        transform.ScaleX *= e.Delta.Scale;
        transform.ScaleY *= e.Delta.Scale;
    }
}

private void OnManipulationCompleted(object sender, ManipulationCompletedRoutedEventArgs e)
{
    ((FrameworkElement)sender).Opacity = 1;
}

编辑:只有当鼠标拖动周围的项目时,才会发生这种情况。

你能发布一些源代码来查看你到底做了什么吗?@Leonbohman编辑了我的问题,DragEnter/DragLeave事件对你不起作用?@BionicCode我应该如何处理这些事件?我看不出这有什么帮助。你可以替换操纵事件,它可能会导致奇怪的拖动行为。
private void OnManipulationStarted(object sender, ManipulationStartedRoutedEventArgs e)
{
    if (sender is TextBox)
        (sender as TextBox).IsReadOnly = true;
    ((FrameworkElement)sender).Opacity = 0.6;
}

private void OnManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
{
    var frameworkElement = (FrameworkElement)sender;
    var transform = (CompositeTransform)frameworkElement.RenderTransform;

    // LEFT-RIGHT bounds
    if (e.Delta.Translation.X < 0) // Going left
    {
        if (DrawingArea.ActualWidth / 2 + (transform.TranslateX + e.Delta.Translation.X) - frameworkElement.ActualWidth / 2 > 0)
        {
            // Staying inside, apply translation
            transform.TranslateX += e.Delta.Translation.X;
        }
        else
        {
            // Trying to go outside, because scale sucks to work with, move image back inside
            transform.TranslateX = frameworkElement.ActualWidth / 2 - DrawingArea.ActualWidth / 2;
        }
    }
    else // Going right
    {
        if (DrawingArea.ActualWidth / 2 - (transform.TranslateX + e.Delta.Translation.X) +
            frameworkElement.ActualWidth * (0.5 - transform.ScaleX) > 0)
        {
            // Staying inside, apply translation
            transform.TranslateX += e.Delta.Translation.X;
        }
        else
        {
            // Trying to go outside, because scale sucks to work with, move image back inside
            transform.TranslateX = frameworkElement.ActualWidth * (0.5 - transform.ScaleX) + DrawingArea.ActualWidth / 2;
        }
    }

    // UP-DOWN bounds
    if (e.Delta.Translation.Y < 0) // Going up
    {
        if (DrawingArea.ActualHeight / 2 + (transform.TranslateY + e.Delta.Translation.Y) - frameworkElement.ActualHeight / 2 >
            0)
        {
            // Staying inside, apply translation
            transform.TranslateY += e.Delta.Translation.Y;
        }
        else
        {
            // Trying to go outside, because scale sucks to work with, move image back inside
            transform.TranslateY = frameworkElement.ActualHeight / 2 - DrawingArea.ActualHeight / 2;
        }
    }
    else // Going down
    {
        if (DrawingArea.ActualHeight / 2 - (transform.TranslateY + e.Delta.Translation.Y) +
            frameworkElement.ActualHeight * (0.5 - transform.ScaleY) > 0)
        {
            // Staying inside, apply translation
            transform.TranslateY += e.Delta.Translation.Y;
        }
        else
        {
            // Trying to go outside, because scale sucks to work with, move image back inside
            // transform.TranslateY = image.ActualHeight*(0.5 - transform.ScaleY) + DrawingArea.ActualHeight/2;

            // Dragging down, remove image
            DrawingArea.Children.Remove(frameworkElement);
        }
    }

    // Only allow scaling when both dimensions are smaller than the drawingarea
    if (frameworkElement.ActualHeight * (transform.ScaleY * e.Delta.Scale) < DrawingArea.ActualHeight &&
        frameworkElement.ActualWidth * (transform.ScaleX * e.Delta.Scale) < DrawingArea.ActualWidth)
    {
        transform.ScaleX *= e.Delta.Scale;
        transform.ScaleY *= e.Delta.Scale;
    }
}

private void OnManipulationCompleted(object sender, ManipulationCompletedRoutedEventArgs e)
{
    ((FrameworkElement)sender).Opacity = 1;
}