2010-08-05 232 views
0

一个文本框我具有由单文本框移动鼠标

<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的一个自定义的WPF控制。

我想在画布上移动我的控件只有当我点击文本框并移动鼠标。当我点击控件和文本框边框之间的边距时,我不想移动控件。 我开始书面方式代码,它看起来像

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

}

但是我控制不动:(我做了什么错?这是很难调试这:)

回答

2

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

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

嗯,我会检查一下。但parentItem应该等于“this”。我会告诉你,如果你的解决方案在你的PreviewMouseDown事件中工作 – george 2010-08-05 21:55:17

+0

,你将parentitem设置为this.Parent ... parentItem = this.Parent as DesignerItem; – 2010-08-05 22:58:15