2015-05-04 92 views
0

在於向世人證明這個問題我有此XAML:WPF ListView和ScrollViewer中隱藏的MouseLeftButtonDown

<DockPanel MouseLeftButtonDown="DockPanel_MouseLeftButtonDown" MouseLeftButtonUp="DockPanel_MouseLeftButtonUp"> 
     <ListView> 
      <ListViewItem>ListViewItem</ListViewItem> 
     </ListView> 
     <TextBlock>TextBlock</TextBlock> 
    </DockPanel> 

和事件處理程序是:

private void DockPanel_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     Console.WriteLine("DockPanel_MouseLeftButtonDown"); 
    } 


    private void DockPanel_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
    { 
     Console.WriteLine("DockPanel_MouseLeftButtonUp"); 
    } 

當你運行應用程序,點擊單詞TextBlock的你在MouseDown之後觸發MouseDown。到現在爲止還挺好。但是當你點擊單詞ListViewItem時,只有MouseUp被觸發。 ScrollViewer的同樣的問題(列表視圖包括它,所以我猜這是同樣的問題)。 有人知道爲什麼,如果這可以解決。 固定我的意思是讓它着火不要試圖使用另一個事件或其他機制在一起。

回答

2

第一問題: 由於懷疑問題出在ScrollViewer中:http://referencesource.microsoft.com/#PresentationFramework/Framework/System/Windows/Controls/ScrollViewer.cs,488ab4a977a015eb

protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) 
    { 
     if (Focus()) 
      e.Handled = true; 
     base.OnMouseLeftButtonDown(e); 
    } 

正如你可以看到它設置MouseButtonEventArgs.Handled爲true其停止事件的冒泡。

現在的解決方案 - 這是你的方式添加的處理程序:

 MyListView.AddHandler(
      ListView.MouseLeftButtonDownEvent, 
      new MouseButtonEventHandler(ListView_MouseLeftButtonDown), 
      true); 

注意最後一個參數(真),它會導致即使EventArgs.Hanlded設置爲true要調用的處理程序。 然後你就可以重新設置:

private void ListView_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     e.Handled = false; 
    } 
-2

我有幾分類似情況時的ScrollViewer擋住了我的MouseLeftButtonDown事件。我有一個包含在ScrollViewer中的內容控制:

<ScrollViewer VerticalScrollBarVisibility="Auto"> 
    <ContentControl x:Name="Details" /> 
</ScrollViewer> 

這是在彈出式窗口裏面有拖放行爲。所以,因爲我的行爲沒有收到這個事件,所以沒有奏效。當我向ScrollViewer添加IsHitTestVisible =「True」時,我的行爲開始發揮作用,但我的ContentControl當然沒有響應任何點擊。然後我看到這個:

protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) 
{ 
    if (Focus()) 
     e.Handled = true; 
    base.OnMouseLeftButtonDown(e); 
} 

並試圖添加Focusable =「False」從我的點擊排除ScrollViewer - 它的工作原理。我的行爲在ContentControl內部工作並控制着所有的鼠標事件。

<ScrollViewer VerticalScrollBarVisibility="Auto" Focusable="False"> 
    <ContentControl x:Name="Details" /> 
</ScrollViewer> 

希望它能幫助別人。

+0

是的,會傳回鼠標事件,但也會禁用該ScrollViewer上的鍵盤的使用。例如箭頭鍵。 –

+0

這是真的,但這是在這種情況下的價格。 – Victor