拖放TextBox?

时间:2015-09-02 08:38:59

标签: c# wpf textbox winrt-xaml uwp

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

我已经实现了这个:

textBox.LostFocus设置textBox.IsReadOnly = true;
textBox.DoubleTappedIsReadOnly设置为false,以便它可以拖动 textBox.ManipulationDelta移动文本框。

现在我遇到问题textBox正在进行橡皮筋效应,这会阻止操作事件。

有没有办法禁用它?或者我可以说,当鼠标点击(或手指或其他)时,它应该开始操作事件?

TextBox的代码:

private TextBox CreateManipulativeTextBox(string text)
{
    var textBox = new TextBox
    {
        Text = text,
        Background = new SolidColorBrush(Color.FromArgb(0, 0, 0, 0)),
        BorderBrush = new SolidColorBrush(Color.FromArgb(128, 0, 0, 0)),
        Width = 150,
        Height = 50,
        ManipulationMode = ManipulationModes.TranslateX | ManipulationModes.TranslateY | ManipulationModes.Scale,
        RenderTransform = new CompositeTransform()
    };

    // Doubletap gives edit possibility, tap outside loses editability
    textBox.LostFocus += TextBoxOnLostFocus;
    textBox.DoubleTapped += TextBoxOnDoubleTapped;

    // Add manipulation events
    textBox.ManipulationStarted += OnManipulationStarted;
    textBox.ManipulationDelta += OnManipulationDelta;
    textBox.ManipulationCompleted += OnManipulationCompleted;

    return textBox;
}

焦点和散焦代码:

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;
}

编辑:只有当鼠标拖动它周围的物品时,触摸才会发生这种情况。

0 个答案:

没有答案