Entschärfung: Horizontales Scrollen und Virtualisierung

Diese Änderung betrifft ItemsControl-Objekte mit eigener Virtualisierung in der senkrecht zur Hauptscrollrichtung stehenden Richtung. (Das Hauptbeispiel hierfür ist ein DataGrid-Steuerelement, bei dem EnableColumnVirtualization auf true festgelegt ist.) Das Ergebnis bestimmter horizontaler Scrollvorgänge wurde geändert, um Ergebnisse zu erzeugen, die intuitiver und in höheren Maß analog zu den Ergebnissen vergleichbarer vertikaler Vorgänge sind. Zu den Vorgängen gehören im Einzelnen Bildlauf hierhin durchführen und Rechte Kante, um die Namen aus dem Menü zu verwenden, das durch Klicken mit der rechten Maustaste auf eine horizontale Scrollleiste angezeigt wird. Beide berechnen einen Kandidatenoffset und rufen IScrollInfo.SetHorizontalOffset auf. Nach dem Scrollen zum neuen Offset hat sich die Definition von „hierhin“ oder „rechte Kante“ möglicherweise geändert, da die neuen entvirtualisierten Inhalte den Wert von IScrollInfo.ExtentWidth geändert haben.

Beschreibung der Änderung

Vor .NET Framework 4.6.2 verwendet der Scrollvorgang einfach den Kandidatenoffset, obwohl er möglicherweise nicht mehr „hierhin“ oder „rechte Kante“ darstellt. Dies führt zu Effekten wie einem „Springen“ des Leistenziehpunkts, die sich am besten durch ein Beispiel veranschaulichen lassen. Nehmen Sie an, für ein DataGrid-Steuerelement wurde ExtentWidth auf 1000 und Width auf 200 festgelegt. Ein Scrollen zu „Rechte Kante“ verwendet den Kandidatenoffset 1000 - 200 = 800. Beim Scrollen zu diesem Offset werden neue Spalten entvirtualisiert; nehmen wir an, dass sie sehr breit sind, sodass sich ExtentWidth in 2000 ändert. Das Scrollen endet bei HorizontalOffset = 800, und der Ziehpunkt springt annähernd zur Mitte der Bildlaufleiste zurück – genau bei 800/2000 = 40 %.

Von .NET Framework 4.6.2 an wird beim Eintreten dieser Situation ein neuer Kandidatenoffset berechnet. (Beim vertikalen Scrollen wurde dies bereits implementiert.)

Auswirkungen

Die Änderung ergibt ein besser vorhersehbares und intuitiveres Verhalten für den Endbenutzer, sie kann sich aber auf jede App auswirken, die auf den genauen Wert von IScrollInfo.HorizontalOffset nach einem horizontalen Scrollvorgang angewiesen ist, ob vom Endbenutzer oder durch einen expliziten Aufruf von IScrollInfo.SetHorizontalOffset aufgerufen.

Problemumgehung

Eine App, die einen vorhergesagten Wert für IScrollInfo.HorizontalOffset verwendet, sollte so geändert werden, dass sie nach jedem horizontalen Scrollen, durch das ExtentWidth aufgrund der Entvirtualisierung geändert werden könnte, den tatsächlichen Wert (und den Wert von ExtentWidth) abruft.

Siehe auch

Änderungen zur Laufzeit