在WPF中移动任何控件

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>

这是相关的代码

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

代码可以运行,但是移动时控件抖动。
问题出在哪里?

2
你能否尝试更详细地解释正在发生的事情。 - ChrisF
控件移动了,但在移动过程中强烈震动。 - am shammout
1
请查看 System.Windows.Controls.Primitives.Thumb 类。 - Nicolas Repiquet
2个回答

5
当您调用GetPosition时,应使用DropCanvas作为参数而不是控件。因为文本框一直在移动,您需要使用固定的东西来避免出现振动。
另外,您也可以使用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);

}

//// 鼠标拖动元素行为 db;

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接