5

私はwpfでコントロールを移動しようとしていますCanvas

これは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;        
    }

コードは機能していますが、コードが移動すると、コントロールが揺れます。
問題は何ですか

4

2 に答える 2

5

呼び出すときは、コントロールの代わりにパラメーターとしてGetPosition使用する必要があります。DropCanvasTextBoxが動き続け、何かを修正する必要があるため、振動が発生しています。

または、MouseDragElementBehaviorExpression Blend SDKで利用可能なものを使用して、コンテナ内のオブジェクトを移動することもできます。

また、このプロジェクトはあなたに役立つ可能性があります:http: //www.codeproject.com/Articles/24681/WPF-Diagram-Designer-Part-4

于 2012-04-24T13:20:45.083 に答える
0
    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); 
        }
于 2014-06-20T07:18:34.213 に答える