2017-09-23 40 views
0

我正嘗試在WPF應用程序中使用鼠標移動按鈕。WPF Move elemnt with mouse

有XAML網格是結構的根:

<Grid Name="MyGrid"   > 
    <Button Name="Samplebutton" 
      PreviewMouseDown="Samplebutton_PreviewMouseDown" 
      PreviewMouseUp="Samplebutton_PreviewMouseUp" 
      PreviewMouseMove="Samplebutton_PreviewMouseMove" 
      Content="Moving" Width="100" Height="35"/> 
</Grid> 

而後面的代碼:

private bool _isMoving; 


private void Samplebutton_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
{ 
    _isMoving = true; 
} 

private void Samplebutton_PreviewMouseUp(object sender, MouseButtonEventArgs e) 
{ 
    _isMoving = false; 
} 

private void Samplebutton_PreviewMouseMove(object sender, MouseEventArgs e) 
{ 
    if (!_isMoving) return; 

    TranslateTransform transform = new TranslateTransform(); 
    transform.X = Mouse.GetPosition(MyGrid).X; 
    transform.Y = Mouse.GetPosition(MyGrid).Y; 
    this.Samplebutton.RenderTransform = transform; 
} 

首先點擊進入按鈕移至他遠,然後我可以移動按鈕,但對於第一次將按鈕移開。我錯過了什麼?

+0

TranslateTransform是從按鈕的原始位置進行相對翻譯。網格元素內的鼠標位置是絕對的。我認爲你必須做一些數學,並減去按鈕的原始位置,以將絕對值轉換爲相對距離。 – Auskennfuchs

回答

1

下面是你的問題完整的解決方案:

private bool _isMoving; 
private Point? _buttonPosition; 
private double deltaX; 
private double deltaY; 
private TranslateTransform _currentTT; 

private void Samplebutton_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
{ 
    if(_buttonPosition == null) 
     _buttonPosition = Samplebutton.TransformToAncestor(MyGrid).Transform(new Point(0, 0)); 
    var mousePosition = Mouse.GetPosition(MyGrid); 
    deltaX = mousePosition.X - _buttonPosition.Value.X; 
    deltaY = mousePosition.Y - _buttonPosition.Value.Y; 
    _isMoving = true; 
} 

private void Samplebutton_PreviewMouseUp(object sender, MouseButtonEventArgs e) 
{ 
    _currentTT = Samplebutton.RenderTransform as TranslateTransform; 
    _isMoving = false; 
} 

private void Samplebutton_PreviewMouseMove(object sender, MouseEventArgs e) 
{ 
    if (!_isMoving) return; 

    var mousePoint = Mouse.GetPosition(MyGrid); 

    var offsetX = (_currentTT == null ?_buttonPosition.Value.X : _buttonPosition.Value.X - _currentTT.X) + deltaX - mousePoint.X; 
    var offsetY = (_currentTT == null ? _buttonPosition.Value.Y : _buttonPosition.Value.Y - _currentTT.Y) + deltaY - mousePoint.Y; 

    this.Samplebutton.RenderTransform = new TranslateTransform(-offsetX, -offsetY); 
} 
2

您需要保存在一審鼠標的位置,並始終使用從此「相對」 X/Y位置

private double _startX; // Or whatever number type Mouse.GetPosition(MyGrid).X returns 
private double _startY; // Or whatever number type Mouse.GetPosition(MyGrid).Y returns 

private void Samplebutton_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
{ 
    _startX = Mouse.GetPosition(MyGrid).X; 
    _startY = Mouse.GetPosition(MyGrid).Y; 
    _isMoving = true; 
} 

private void Samplebutton_PreviewMouseMove(object sender, MouseEventArgs e) 
{ 
    if (!_isMoving) return; 

    TranslateTransform transform = new TranslateTransform(); 
    transform.X = Mouse.GetPosition(MyGrid).X - _startX; 
    transform.Y = Mouse.GetPosition(MyGrid).Y - _startY; 
    this.Samplebutton.RenderTransform = transform; 
}