Holen Sie sich Erste Sichtbare Element in WPF ListView in C#
Jemand wissen, wie man ein ListViewItem durch greifen das erste sichtbare Element in der ListView? Ich weiß, wie man das Element an index 0, aber nicht die ersten sichtbaren eins.
System.Windows.Controls.ListViewItemGetListViewItemFromEvent(object sender,object originalSource){DependencyObject depObj = originalSource asDependencyObject;if(depObj !=null){//go up the visual hierarchy until we find the list view item the click came from //the click might have been on the grid or column headers so we need to cater for this DependencyObject current = depObj;while(current !=null&& current !=SoundListView){System.Windows.Controls.ListViewItemListViewItem= current asSystem.Windows.Controls.ListViewItem;if(ListViewItem!=null){returnListViewItem;}
current =VisualTreeHelper.GetParent(current);}}returnnull;}
Nach dem Versuch, um herauszufinden, etwas ähnliches, ich dachte, ich würde teilen meine Ergebnis hier (wie es scheint leichter als die anderen Antworten):
Danach können Sie die Schleife durch die listboxitems und verwenden diesen test, um festzustellen, welche sichtbar sind. Da die listboxitems sind immer das gleiche bestellt die erste sichtbare in dieser Liste wäre der erste sichtbare für den Benutzer.
Haben wir nur zum berechnen des offset des Listenfelds, und das erste sichtbare Element wird das Element an der index gleich der VerticalOffset...
//queue is the name of my listboxVirtualizingStackPanel panel =VisualTreeHelper.GetParent(queue.Items[0]asListBoxItem)asVirtualizingStackPanel;int offset =(int)panel.VerticalOffset;//then our desired listboxitem is:ListBoxItem item =queue.Items[offset]asListBoxItem;
Hoffe, dies hilft Ihnen . . .!
Ich bin immer der Fehler: An unhandled exception of type 'System.InvalidCastException' occurred. Ich nehme an, es wird auf casting-listBox.Items[0]
Ich denke, es funktioniert nicht bei der Gruppierung, aber ansonsten ist es der Schnellste Weg (weit)
Die Gesamtheit der WPF - ListView scheint zu verhindern, dass die Klasse, die von der Bereitstellung einer Immobilie wie WinForms' TopItem. Allerdings, wenn die Instanz so konfiguriert ist, mit einem VirtualizingStackPanel, können Sie eine Abfrage für die oberste index direkt. Dies vermeidet das suchen und iteration erforderlich, die durch andere Ansätze. (Der Ansatz basiert auf dieser Beitrag.)
Ich denke, dass die Treffer-test-Methode die akzeptierte Antwort ist mehr allgemein, aber wenn das, was Sie wirklich wollen, ist eine Liste-index eher als ein Listenelement, dann könnte dies sparen Sie eine IndexOf nennen.
Meine app benötigt zum speichern und wiederherstellen der Liste position nach wesentlichen änderungen an der Liste der Inhalte. Der code zum festlegen der oberen position (basierend auf dieser Beitrag) ist unten gezeigt als gut. Für die Bequemlichkeit, diese sind implementiert als Erweiterung Methoden.
Die überaus praktische GetVisualChild Methode stammt aus einer MSDN-post:
publicstaticclassVisualHelper{publicstatic T GetVisualChild<T>(thisVisual referenceVisual)where T :Visual{Visual child =null;for(Int32 i =0; i <VisualTreeHelper.GetChildrenCount(referenceVisual); i++){
child =VisualTreeHelper.GetChild(referenceVisual, i)asVisual;if(child !=null&& child is T){break;}elseif(child !=null){
child =GetVisualChild<T>(child);if(child !=null&& child is T){break;}}}return child as T;}}
Nutzungs-Hinweis auf ScrollToTopItem: die ScrollToBottom() Aufruf sofort wirksam, aber ScrollIntoView() scheint zurückgestellt werden. Also, wenn Sie anrufen GetTopItemIndex() sofort nach ScrollToTopItem() ist, erhalten Sie den index für ein Element, das in der Nähe der Unterseite.
Update: wollte nur zu beachten, dass ScrollIntoView() dauert 60-100ms auf meinem system, eine Liste mit weniger als 1.000 Elemente. Manchmal ist es leise ausfällt. Ich landete ein "scroll-index" - Methode, die verwendet sv.ScrollToVerticalOffset() statt.
Dieser war so schmerzhaft, um zu arbeiten:
Und die Funktion, um die Liste der Artikel:
Nach dem Versuch, um herauszufinden, etwas ähnliches, ich dachte, ich würde teilen meine Ergebnis hier (wie es scheint leichter als die anderen Antworten):
Einfache Sichtbarkeit testen bekam ich von hier.
Danach können Sie die Schleife durch die listboxitems und verwenden diesen test, um festzustellen, welche sichtbar sind. Da die listboxitems sind immer das gleiche bestellt die erste sichtbare in dieser Liste wäre der erste sichtbare für den Benutzer.
Ich kann nicht glauben, dass es nicht einen leichteren Weg...
http://social.msdn.microsoft.com/forums/en-US/wpf/thread/2d527831-43aa-4fd5-8b7b-08cb5c4ed1db
Haben wir nur zum berechnen des offset des Listenfelds, und das erste sichtbare Element wird das Element an der index gleich der VerticalOffset...
Hoffe, dies hilft Ihnen . . .!
An unhandled exception of type 'System.InvalidCastException' occurred
. Ich nehme an, es wird auf casting-listBox.Items[0]Die Gesamtheit der WPF -
ListView
scheint zu verhindern, dass die Klasse, die von der Bereitstellung einer Immobilie wie WinForms'TopItem
. Allerdings, wenn die Instanz so konfiguriert ist, mit einemVirtualizingStackPanel
, können Sie eine Abfrage für die oberste index direkt. Dies vermeidet das suchen und iteration erforderlich, die durch andere Ansätze. (Der Ansatz basiert auf dieser Beitrag.)Ich denke, dass die Treffer-test-Methode die akzeptierte Antwort ist mehr allgemein, aber wenn das, was Sie wirklich wollen, ist eine Liste-index eher als ein Listenelement, dann könnte dies sparen Sie eine
IndexOf
nennen.Meine app benötigt zum speichern und wiederherstellen der Liste position nach wesentlichen änderungen an der Liste der Inhalte. Der code zum festlegen der oberen position (basierend auf dieser Beitrag) ist unten gezeigt als gut. Für die Bequemlichkeit, diese sind implementiert als Erweiterung Methoden.
Die überaus praktische
GetVisualChild
Methode stammt aus einer MSDN-post:Nutzungs-Hinweis auf
ScrollToTopItem
: dieScrollToBottom()
Aufruf sofort wirksam, aberScrollIntoView()
scheint zurückgestellt werden. Also, wenn Sie anrufenGetTopItemIndex()
sofort nachScrollToTopItem()
ist, erhalten Sie den index für ein Element, das in der Nähe der Unterseite.Update: wollte nur zu beachten, dass
ScrollIntoView()
dauert 60-100ms auf meinem system, eine Liste mit weniger als 1.000 Elemente. Manchmal ist es leise ausfällt. Ich landete ein "scroll-index" - Methode, die verwendetsv.ScrollToVerticalOffset()
statt.