2012-04-24 25 views
5

我試圖用Canvas移動在WPF

這是XAML

<Canvas Grid.Column="1" Grid.Row="0" x:Name="DropCanvas" AllowDrop="True" DragOver="DropCanvas_DragOver" 
      Drop="Canvas_Drop" DragEnter="Canvas_DragEnter" Background="#12000000" > 
     <TextBox Canvas.Left="162" Canvas.Top="188" Height="23" Name="textBox1" Width="120" 
       PreviewMouseMove="textBox1_PreviewMouseMove" 
       PreviewMouseLeftButtonDown="textBox1_PreviewMouseLeftButtonDown" 
       PreviewMouseUp="textBox1_PreviewMouseUp" /> 
    </Canvas> 

移動在WPF控件的任何控制,這是代碼

Point p = new Point(); 
    private void textBox1_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     Control control = sender as Control; 

     control.CaptureMouse(); 
     p = e.GetPosition(control); 
    } 

    private void textBox1_PreviewMouseMove(object sender, MouseEventArgs e) 
    {  
      Control control = sender as Control; 
      Point x = e.GetPosition(control); 
      if (e.LeftButton == MouseButtonState.Pressed) 
      { 
       Canvas.SetLeft(control, Canvas.GetLeft(control) + (x.X - p.X)); 
       Canvas.SetTop(control, Canvas.GetTop(control) + (x.Y - p.Y)); 
      } 
      p = x;   
    } 

    private void textBox1_PreviewMouseUp(object sender, MouseButtonEventArgs e) 
    { 
     Control control = sender as Control; 
     control.ReleaseMouseCapture(); 

     activated = false;   
    } 

的代碼正在工作,但是當它移動時,控制器會抖動。
什麼是proplem

+2

您可以嘗試解釋發生了什麼更詳細的情況。 – ChrisF 2012-04-24 12:54:45

+0

控件已移動,但它在移動過程中強烈振動 – 2012-04-24 13:00:48

+1

請看「System.Windows.Controls.Primitives.Thumb」類。 – 2012-04-24 13:04:22

回答

6

當你打電話GetPosition你應該使用DropCanvas作爲參數,而不是控制。你看到振動,因爲TextBox一直在移動,你需要修正一些東西。

或者,您可以使用Expression Blend SDK中提供的MouseDragElementBehavior移動容器中的對象。

而且,這個項目可以對你有用:http://www.codeproject.com/Articles/24681/WPF-Diagram-Designer-Part-4

0
public void dragme(object sender, MouseButtonEventArgs e) 
{ 
    if (_Move.IsChecked == true) 
     db.Attach((DependencyObject)sender); 

}

//// MouseDragElementBehavior分貝;

private void canvass_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
{ 
if (_Move.IsChecked == true && filmgrid.Visibility == Visibility.Visible)// == true) 
     { 
      filmgrid.PreviewMouseDown += new MouseButtonEventHandler(dragme); 
     }