2011-09-09 13 views
6

W mojej aplikacji WPF, mam ListView na formularzu głównym, który wyświetla powiązane dane z DataSet. Kiedy użytkownik dwukrotnie kliknie wiersz w ListView, otwiera okno szczegółów.Nowe okno WPF wyświetlane jest pod oryginalnym oknem.

W moim XAML, użyłem styl stworzyć kliknij dwukrotnie obsługi na ListView:

<Style x:Key="ListViewDoubleClick" TargetType="{x:Type ListViewItem}"> 
    <EventSetter Event="MouseDoubleClick" Handler="HandleDoubleClick" /> 
</Style> 
... 
<ListView Name="searchResults" ItemContainerStyle="{StaticResource ListViewDoubleClick}> 

w kodzie opóźnieniem, mam słownika, który śledzi Otwórz szczegóły okien (wielokrotny może bądź otwarty na raz), tak, że jeśli okno z detalami jest już otwarte, zostanie ono przeniesione na wierzch. I obsłużyć dwukrotnie kliknij tak:

private void HandleDoubleClick(object sender, MouseEventArgs e) 
{ 
    DataRowView clickedRow = ((ListViewItem)sender).Content as DataRowView; 
    int row = (int)clickedRow.Row["ID"]; 
    if (!displayedCards.ContainsKey(row)) 
    { 
     DetailWindow window = new DetailWindow(RetrieveData(row)); 
     //window.Owner = this; 
     displayedCards.Add(row, window); 
     window.Show(); 
    } 
    else 
    { 
     displayedCards[row].Activate(); 
    } 
} 

Moim problemem jest to, że z oznaczeniem jak to jest powyżej, okna są otwarte detal za głównego formularza. Jeśli ustawię informacje o właścicielu (window.Owner = this), okna szczegółów zostaną otwarte w górnej części głównego formularza, ale główna forma nigdy nie będzie dostępna przed oknami szczegółów.

Urządzenie displayedCards[row].Activate() działa zgodnie z oczekiwaniami, przenosząc to okno szczegółów do przodu wszystkich innych okien szczegółów, ale pada ofiarą tego samego problemu, co powyżej - nie pojawia się przed głównym oknem.

Co chcę osiągnąć to, że okna szczegółów na tym samym poziomie/warstwie (/ z porządku?) Są oknem głównym, tak aby obie mogły pojawiać się jedna nad drugą, i aby pojawiały się okna szczegółów na górze głównego formularza po otwarciu.

Edit: Jeśli to ważne, okno szczegół ma WindowStyle i AllowsTransparency jest ustawiona na wartość true. Nie mam również tytułu okna, a okno nie pojawia się na pasku zadań. Próbując to ustalić, próbowałem ustawić WindowStyle na SingleBorderWindow i wystąpił ten sam problem, z wyjątkiem tego, że krawędź okna szczegółów jest wyświetlana na górze głównej formy podczas rysowania okna szczegółów, a następnie jest przesuwana za główna forma. Czy mój dwuklikowy moduł obsługi mógł zasadniczo ciągnąć główny formularz do przodu po wyświetleniu okna szczegółów?

Odpowiedz

8

Wygląda na to, że nie mówisz systemowi routingu zdarzeń, że obsłużyłeś wydarzenie. Spróbuj ustawić wartość e.Handled na true, aby powiedzieć WPF, aby nie zezwalała na dalsze przetwarzanie zdarzeń. Więcej informacji o tym, jak właściwości Handled zmienia routing zdarzeń, można znaleźć pod numerami RoutedEventArgs.Handled Property i Marking Routed Events as Handled, and Class Handling.

+2

Tak właśnie się stało - dodanie funkcji "e.Handled = true;" na początku mojego programu obsługi podwójnego kliknięcia sprawia, że ​​wszystkie okna działają zgodnie z oczekiwaniami. Dzięki! –

+2

uratowałeś mnie! miesiące, gdy moi klienci skarżyli się, że podwójne kliknięcia otwierają się i chowają okna. dziękuję sto razy! –