2010-08-05 233 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