2016-02-29 74 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事件沒有被調用。