2010-01-13 15 views
9

Mam dwa widok listy na WPF. Pierwszy widok listy jest załadowany z datownikiem. Po dwukrotnym kliknięciu na jeden element z pierwszego widoku listy, wybrana pozycja zostanie przeniesiona do drugiego widoku listy.Jak wykrywać podwójne kliknięcie paska przewijania widoku listy?

Problem pojawia się, gdy pojawia się pasek przewijania w widoku pierwszej listy z powodu dużej liczby elementów załadowanych z DataTable. Jeśli wybierz jeden element i kliknij dwukrotnie strzałkę w dół na pasku przewijania, zdarzenie MouseDoubleClick zostanie uruchomione, a wybrany element zostanie przeniesiony do drugiego widoku listy.

W jaki sposób mogę wykryć podwójne kliknięcie na pasku przewijania, aby temu zapobiec?

Wielkie dzięki!

Odpowiedz

3

Spróbuj to w was zdarzenie MouseDoubleClick na pierwszym ListView:

DependencyObject src = VisualTreeHelper.GetParent((DependencyObject)e.OriginalSource); 

if(src is Control && src.GetType() == typeof(ListViewItem)) 
{ 
    // Your logic here 
} 

podstawie this.

Używam tego w różnych projektach i rozwiązuje problem, przed którym stoisz.

+0

To działa dobrze. Tylko musisz to zrobić czasami 'DependencyObject src = (DependencyObject) (e.OriginalSource); , natomiast (! (Src to Kontrola)) { src = VisualTreeHelper.GetParent (src); } 'aby uzyskać odpowiednią kontrolę –

4

Przetestowałem powyższy kod, który był bardzo pomocny, ale okazało się, że poniższe są bardziej stabilne, ponieważ czasami źródło jest zgłaszane jako GridViewRowPresenter, gdy w rzeczywistości klikasz dwukrotnie element.

var src = VisualTreeHelper.GetParent((DependencyObject)e.OriginalSource); 
var srcType = src.GetType(); 
if (srcType == typeof(ListViewItem) || srcType == typeof(GridViewRowPresenter)) 
{ 
    // Your logic here 
} 
2
private void ListBox_OnMouseDoubleClick(object pSender, MouseButtonEventArgs pE) 
{ 
    FrameworkElement originalSource = pE.OriginalSource as FrameworkElement; 
    FrameworkElement source = pE.Source as FrameworkElement; 

    if (originalSource.DataContext != source.DataContext) 
    { 
     logic here 
    }   
} 

Kiedy masz DataContext można łatwo sprawdzić, czy nadawca jest element lub głównym listbox

+0

OP ma 4 lata. Czy Twoje pytanie zawiera dodatkowe informacje związane z aktualizacją/aktualizacją oprogramowania? Jeśli tak, określ, aby uniknąć nieporozumień. – gmo

0

Mam ostateczne rozwiązanie:

private void ListView_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e) 
{ 
    var originalSource = (DependencyObject)e.OriginalSource; 
    while ((originalSource != null) && !(originalSource is ListViewItem)) originalSource = VisualTreeHelper.GetParent(originalSource); 
    if (originalSource == null) return; 
} 

to działa? dla mnie.

Powiązane problemy