用鼠标移动文本框 [英] moving a textbox with mouse

查看:84
本文介绍了用鼠标移动文本框的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个自定义WPF控件,其中包含单个TextBox

I have a custom WPF control which consist of single TextBox

<UserControl HorizontalAlignment="Left" x:Class="WPFDiagramDesignerControl.Components.UcWBSBlock"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="100" Width="100" IsEnabled="True">

    <Grid >
        <TextBox x:Name="txtBox" IsEnabled="True"   Background="AntiqueWhite"  Margin="10,10,10,10" TextWrapping="Wrap"> </TextBox>
    </Grid>

</UserControl>

控件放置在名为MyDesigner的Canvas上。

The control is placed on Canvas called MyDesigner.

仅当我单击文本框并移动鼠标时,我才想在画布上移动控件。当我单击控件边框和文本框之间的边距时,我不想移动控件。
我开始编写代码,看起来像这样

I want to move my control on canvas only if I click on textbox and move mouse. I don't want to move control when I click on margin between borders of control and textbox. I started writting a code and it looks like that

public partial class UcWBSBlock : UserControl
{

    bool textChanged = false;
    bool isClicked = false;
    Point startPoint;
    DesignerItem parentItem;
    DesignerCanvas parentCanvas;

    public UcWBSBlock()
    {

        InitializeComponent();

        txtBox.MouseDoubleClick+=new MouseButtonEventHandler(txtBox_MouseDoubleClick);
        txtBox.MouseMove+=new MouseEventHandler(txtBox_MouseMove);
        txtBox.PreviewMouseDown+=new MouseButtonEventHandler(txtBox_PreviewMouseDown);
        txtBox.PreviewMouseUp+=new MouseButtonEventHandler(txtBox_PreviewMouseUp);
        txtBox.Cursor = Cursors.SizeAll;

    }

    private void txtBox_MouseMove(object sender, RoutedEventArgs e)
    {
        if (isClicked)
        {
            Point mousePos = Mouse.GetPosition(parentCanvas);

            parentItem = this.Parent as DesignerItem;
            parentCanvas = parentItem.Parent as DesignerCanvas;
            Point relativePosition = Mouse.GetPosition(parentCanvas);
            DesignerCanvas.SetLeft(parentItem,DesignerCanvas.GetLeft(parentItem) -  (startPoint.X - mousePos.X));
            DesignerCanvas.SetTop(parentItem, DesignerCanvas.GetTop(parentItem) - (startPoint.Y - mousePos.Y));
        }  
    }

    private void txtBox_PreviewMouseDown(object sender, RoutedEventArgs e)
    {
        if (!isClicked)
        {
            isClicked = true;
            parentItem = this.Parent as DesignerItem;
            parentCanvas = parentItem.Parent as DesignerCanvas;
            startPoint = Mouse.GetPosition(parentCanvas);
        }
    }

    private void txtBox_PreviewMouseUp(object sender, RoutedEventArgs e)
    {
        isClicked = false;
    }
}

}

但是我的控件没有移动:(我做错了什么?很难调试:)

However my control doesn't move :( What did I do wrong ?? It's hard to debug this :)

推荐答案

您要设置父项的左/顶部,而不是控件:

you are setting the left/top of the parent item, not your control:

DesignerCanvas.SetLeft(parentItem,DesignerCanvas.GetLeft(parentItem) -  (startPoint.X - mousePos.X));
DesignerCanvas.SetTop(parentItem, DesignerCanvas.GetTop(parentItem) - (startPoint.Y - mousePos.Y));

(可能)应该像这样:

DesignerCanvas.SetLeft(this,DesignerCanvas.GetLeft(this) -  (startPoint.X - mousePos.X));
DesignerCanvas.SetTop(this, DesignerCanvas.GetTop(this) - (startPoint.Y - mousePos.Y));

这篇关于用鼠标移动文本框的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆