2013-06-25 49 views
4

我試圖移動基於鼠標位置的按鈕,但當按鈕移動時它會閃爍。請從下面的代碼,移動基於鼠標位置的wpf按鈕,但閃爍

下面的XAML代碼,

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

CS,

private bool m_IsPressed = false; 

    private void Samplebutton_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
    { 
     if (e.ChangedButton == MouseButton.Left) 
     { 
      m_IsPressed = true; 
     } 
     else 
     { 
      m_IsPressed = false; 
     } 
    } 

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

    private void Samplebutton_PreviewMouseMove(object sender, MouseEventArgs e) 
    { 
     if (m_IsPressed) 
     { 
      TranslateTransform transform = new TranslateTransform(); 
      transform.X = Mouse.GetPosition(sender as Button).X; 
      transform.Y = Mouse.GetPosition(sender as Button).Y; 
      this.Samplebutton.RenderTransform = transform; 
     } 
    } 

中的任何一個,請提供您的建議?

回答

3

您的「閃爍」是由您的PreviewMouseMove處理程序中的轉換引起的。

您正在改變控件的X和Y位置,使用鼠標相對於Button控件的位置,這將在每次應用變換時改變。每當按鈕位置改變時,您的Mouse.GetPosition(sender as Button).X & Y將返回不同的值,導致按鈕再次改變位置,依此類推。解決此

一種方法是擺脫父元素的鼠標位置(例如GridCanvas有一個固定的位置):

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

private void Samplebutton_PreviewMouseMove(object sender, MouseEventArgs e) 
    { 
     if (m_IsPressed) 
     { 
      TranslateTransform transform = new TranslateTransform(); 
      transform.X = Mouse.GetPosition(myGrid).X; 
      transform.Y = Mouse.GetPosition(myGrid).Y; 
      this.Samplebutton.RenderTransform = transform; 
     } 
    } 

這會不會是這是世界上最漂亮的東西,因爲它會從左上角「抓住」按鈕,但您可以調整位置以獲得所需的行爲。

祝你好運。

編輯:如果你不想明確地命名您希望使用的相對位置的元素,你應該能夠通過查詢sender對象來選擇直接父:

transform.X = Mouse.GetPosition((sender as Button).Parent as FrameworkElement).X; 
+0

謝謝,我會檢查並讓你知道。 – Muthalagu

1
private void button_PreviewMouseDown_1(object sender, MouseButtonEventArgs e) 
    { 
     button.CaptureMouse(); 
    } 

    private void button_PreviewMouseUp_1(object sender, MouseButtonEventArgs e) 
    { 
     button.ReleaseMouseCapture(); 
    } 

    private void button_PreviewMouseMove_1(object sender, MouseEventArgs e) 
    { 

     if (button.IsMouseCaptured) 
     { 
      Canvas.SetLeft(button, e.GetPosition(this).X); 
      Canvas.SetTop(button, e.GetPosition(this).Y); 

     } 
    } 
+0

感謝您的努力,但我不想通過Canvas實現這一目標。 – Muthalagu