2015-05-04 2 views
0

Для demostrate проблемы у меня есть этот 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, а затем MouseUp. Все идет нормально. Но когда вы нажимаете на слова ListViewItem, запускается только MouseUp. Такая же проблема для ScrollViewer (представление List включает в себя, поэтому я предполагаю, что это та же проблема). Кто-нибудь знает, почему и если это можно исправить. По фиксированному я имею в виду, чтобы он стрелял, чтобы не пытаться использовать другое событие или другой механизм вместе.

ответ

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 истина, которая останавливает бульканье события.

Теперь решение - это так, как вы добавить обработчик:

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

Обратите внимание, что последний параметр (истина), он вызывает обработчик будет вызван даже если EventArgs.Hanlded была установлена ​​истина. Тогда вы можете сбросить его:

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

я имел несколько похожей ситуацию, когда ScrollViewer блокировал мое событие MouseLeftButtonDown. Я имел контроль над содержанием завернутого в ScrollViewer:

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

и это было внутри всплывающего окна, которое было перетащить/падение поведения. Итак, поскольку мое поведение не получало это событие, оно не сработало. Когда я добавил IsHitTestVisible = «True» в ScrollViewer, мое поведение начало работать, но, конечно, мой 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

Смежные вопросы