【问题标题】:moving a textbox with mouse用鼠标移动文本框
【发布时间】:2016-12-10 20:39:51
【问题描述】:

我有一个由单个 TextBox 组成的自定义 WPF 控件

<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 上。

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

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

}

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

【问题讨论】:

    标签: c# wpf controls


    【解决方案1】:

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

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

    【讨论】:

    • 嗯,我看看这个。但是 parentItem 应该等于“this”。我明天会告诉你你的解决方案是否有效
    • 在 PreviewMouseDown 事件中,您将 parentitem 设置为 this.Parent... parentItem = this.Parent as DesignerItem;
    猜你喜欢
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    相关资源
    最近更新 更多