2016-02-29 78 views
1

正试图在WPF中实现拖放操作。我现在的代码允许我单击按钮的左上角并将其向下或向右拖动。拖放WPF不允许我向左或向上拖动

出于某种原因,它不会让我向左或向上拖,而我看不出为什么。

的代码如下:

private void ctlTextbox_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    //In this event, we get current mouse position on the control to use it in the MouseMove event. 
    FirstXPos = e.GetPosition(sender as Control).X; 
    FirstYPos = e.GetPosition(sender as Control).Y; 
    FirstArrowXPos = e.GetPosition((sender as Control).Parent as Control).X - FirstXPos; 
    FirstArrowYPos = e.GetPosition((sender as Control).Parent as Control).Y - FirstYPos; 
} 

private void ctlTextbox_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (e.LeftButton == MouseButtonState.Pressed) 
    { 
     (sender as FrameworkElement).SetValue(Canvas.LeftProperty, 
      e.GetPosition((sender as FrameworkElement).Parent as FrameworkElement).X - FirstXPos); 

     (sender as FrameworkElement).SetValue(Canvas.TopProperty, 
      e.GetPosition((sender as FrameworkElement).Parent as FrameworkElement).Y - FirstYPos); 
    } 
} 

的XAML:

<Canvas x:Name="MainGrid" RenderTransformOrigin = "0.499,0.425" AllowDrop="True" > 
     <Button x:Name="button" Content="112" Style="{StaticResource RoomButton}" MouseLeftButtonDown="ctlTextbox_MouseLeftButtonDown" MouseMove="ctlTextbox_MouseMove" Height="32" Canvas.Left="69" Canvas.Top="67" Width="65" Margin="0" /> 
</Canvas> 
+0

除了你的问题...什么是'PreviewMouseLeftButtonUp(...)'代码应该做的? 'object MovingObject = sender; MovingObject = null;'您将'MovingObject'设置为发件人,然后在将'MovingObject'设置为null后立即设置。我没有看到这一点。 –

+0

请参阅使用XAML代码进行编辑,以显示这些功能的用途 – AJH

+0

这仍然无法解决左/右拖动问题。 – AJH

回答

0

试试以下的方法:

  1. 添加一个私有字段在Window称为_movingObject

    private FrameworkElement _movingObject; 
    
  2. 修改您的XAML这样的:

    <Canvas x:Name="MainGrid" RenderTransformOrigin = "0.499,0.425" AllowDrop="True" 
         Background="Transparent" PreviewMouseMove="CanvasPreviewMouseMove"> 
        <Button x:Name="button" Style="{StaticResource RoomButton}" 
          PreviewMouseLeftButtonDown="UIElementPreviewMouseLeftButtonDown" 
          PreviewMouseLeftButtonUp="UIElementPreviewMouseLeftButtonUp" 
          Height="32" Canvas.Left="69" Canvas.Top="67" Width="65" Margin="0" /> 
    </Canvas> 
    
  3. 添加以下处理程序中的代码隐藏:

    private void UIElementPreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
        _movingObject = sender as FrameworkElement; 
    } 
    
    private void UIElementPreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
    { 
        _movingObject = null; 
    } 
    
    private void CanvasPreviewMouseMove(object sender, MouseEventArgs e) 
    { 
        var mousePos = e.GetPosition(sender as IInputElement); 
        if (e.LeftButton == MouseButtonState.Pressed && _movingObject != null) 
        { 
         _movingObject.SetValue(Canvas.LeftProperty, mousePos.X); 
         _movingObject.SetValue(Canvas.TopProperty, mousePos.Y); 
        } 
    } 
    

的问题是,当你移动你的鼠标向上或者让你将它移动到你试图拖动的控件的边界之外,所以它的MouseMove事件没有被调用。