2010-08-28 14 views
0

我需要有兩個目的一個按鈕處理程序在WPF拖動窗口:
- 用戶可以使用該按鈕拖動應用程序的窗口
- 用戶只需按一下按鈕,切換可見窗口中的其他元素。使用DragMove方法,並點擊同一個按鈕

該按鈕是一個PNG圖像。

我試圖做下列方式:

XAML:

<Button Name="toggleButton" Click="toggleButton_Click" Canvas.Left="177" Canvas.Top="0"> 
    <Button.Template> 
    <ControlTemplate> 
     <Image Source="/FootballRssReader;component/images/ball.png" MouseLeftButtonDown="toggleButton_MouseLeftButtonDown"/> 
    </ControlTemplate> 
    </Button.Template> 
</Button> 

C#:

private void toggleButton_Click(object sender, RoutedEventArgs e) 
     { 
      contentVisible = !contentVisible; 
      content.Visibility = contentVisible ? Visibility.Visible : Visibility.Collapsed; 
     } 

private void toggleButton_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
     { 
      DragMove(); 
     } 

的問題是,只有窗口動人的藝術品。點擊按鈕不會調用Click事件處理程序。當我從按鈕的圖像中刪除MouseLeftButtonDown事件處理時,Click事件被執行。

任何人都可以幫助我嗎?有沒有可能創建這樣一個按鈕?

我試過設置在圖像中處理爲false,但它沒有幫助。

感謝,米哈爾

回答

7

DragMove啓動一個模式消息循環,並不會返回,直到鼠標按鈕被釋放,所以通過按鈕接收MouseLeftButtonDown事件的時候,它已經失去了點擊的機會。

我假設你不希望點擊發生,如果用戶拖動窗口。一種方法是做類似於拖放的操作,並且只有當鼠標按下時鼠標開始移動時才調用DragMove。附加處理程序的PreviewMouseLeftButtonDown和PreviewMouseMove的按鈕:

<Button Name="toggleButton" Click="toggleButton_Click" 
    Canvas.Left="177" Canvas.Top="0" 
    PreviewMouseMove="toggleButton_PreviewMouseMove" 
    PreviewMouseLeftButtonDown="toggleButton_PreviewMouseLeftButtonDown"> 
    <Button.Template> 
     <ControlTemplate> 
      <Image Source="/FootballRssReader;component/images/ball.png"/> 
     </ControlTemplate> 
    </Button.Template> 
</Button> 

記錄在PreviewLeftMouseButtonDown處理鼠標的位置,然後啓動DragMove在PreviewMouseMove處理程序如果鼠標已經開始移動:

private Point startPoint; 

private void toggleButton_PreviewMouseLeftButtonDown(
    object sender, MouseButtonEventArgs e) 
{ 
    startPoint = e.GetPosition(toggleButton); 
} 

private void toggleButton_PreviewMouseMove(object sender, MouseEventArgs e) 
{ 
    var currentPoint = e.GetPosition(toggleButton); 
    if (e.LeftButton == MouseButtonState.Pressed && 
     toggleButton.IsMouseCaptured && 
     (Math.Abs(currentPoint.X - startPoint.X) > 
      SystemParameters.MinimumHorizontalDragDistance || 
     Math.Abs(currentPoint.Y - startPoint.Y) > 
      SystemParameters.MinimumVerticalDragDistance)) 
    { 
     // Prevent Click from firing 
     toggleButton.ReleaseMouseCapture(); 
     DragMove(); 
    } 
}