【问题标题】:moving any control in wpf在 wpf 中移动任何控件
【发布时间】:2016-09-26 13:51:37
【问题描述】:

我正在尝试使用 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;        
    }

代码可以运行,但是当它移动时,控件会抖动。
什么问题

【问题讨论】:

  • 您能否尝试更详细地解释正在发生的事情。
  • 控件移动了,但在移动过程中振动很大
  • 看看System.Windows.Controls.Primitives.Thumb类。

标签: wpf controls


【解决方案1】:

当您调用GetPosition 时,您应该使用DropCanvas 作为参数而不是控件。您看到振动是因为 TextBox 一直在移动,您需要修复一些东西。

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

另外,这个项目可能对你有用:http://www.codeproject.com/Articles/24681/WPF-Diagram-Designer-Part-4

【讨论】:

    【解决方案2】:
        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); 
            }
    

    【讨论】:

      猜你喜欢
      • 2011-02-19
      • 2011-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-22
      相关资源
      最近更新 更多