2017-09-23 33 views
0

WPFアプリでマウスでボタンを移動しようとしています。WPFマウスで移動する

構造のルートである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; 
} 

ボタンへの最初のクリックが遠くに彼を移動し、その後、私はボタンを移動することができますが、ためには、はじめてボタンを離したときです。私は何が欠けているのですか?あなたが最初のインスタンスでのマウスの位置を保存し、常に以下

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; 
} 
+0

TranslateTransformは、ボタンの元の位置からの相対移動です。マウスの位置はグリッド要素の中で絶対的です。数学をしてボタンの元の位置を引いて、絶対値を相対距離に変換しなければならないと思います。 – Auskennfuchs

答えて

1

に続いから「相対」X/Y位置を使用する必要があります

2

はあなたの問題の完全なソリューションです。

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); 
} 
関連する問題