moving any control in wpf

2019-04-08 19:46发布

I am trying to move control in wpf using Canvas

This is the 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>

and this is the Code

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

The code is working, but when it moves, the control shakes.
What is the proplem

标签: wpf controls
2条回答
Rolldiameter
2楼-- · 2019-04-08 20:32
    public void dragme(object sender, MouseButtonEventArgs e)
{
    if (_Move.IsChecked == true)
        db.Attach((DependencyObject)sender);

}

//// MouseDragElementBehavior db;

 private void canvass_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
{
if (_Move.IsChecked == true && filmgrid.Visibility == Visibility.Visible)// == true)  
        {
            filmgrid.PreviewMouseDown += new MouseButtonEventHandler(dragme); 
        }
查看更多
我欲成王,谁敢阻挡
3楼-- · 2019-04-08 20:38

When you call GetPosition you should use DropCanvas as the parameter instead of the control. You're seeing vibrations because the TextBox keeps moving and you need something fixed.

Alternatively, you can use the MouseDragElementBehavior available in Expression Blend SDK to move objects in a container.

Also, this project can be useful to you: http://www.codeproject.com/Articles/24681/WPF-Diagram-Designer-Part-4

查看更多
登录 后发表回答