Freigeben über


Laufzeitänderungen für die Migration zu .NET Framework 4.6.x

In diesem Artikel werden App-Kompatibilitätsprobleme aufgeführt, die in .NET Framework 4.6, 4.6.1 und 4.6.2 auftreten.

.NET Framework 4.6

ASP.NET

GridView-Steuerelemente, bei denen „AllowCustomPaging“ auf TRUE festgelegt ist, kann das Ereignis „PageIndexChanging“ ausgelöst werden, wenn die letzte Seite der Ansicht verlassen wird

Einzelheiten

Ein Fehler im .NET Framework 4.5 bewirkt, dass System.Web.UI.WebControls.GridView.PageIndexChanging manchmal nicht für System.Web.UI.WebControls.GridViews ausgelöst wird, die System.Web.UI.WebControls.GridView.AllowCustomPaging aktiviert haben.

Vorschlag

Dieses Problem wurde in .NET Framework 4.6 behoben und kann durch ein Upgrade auf diese Version von .NET Framework behoben werden. Das Problem kann umgangen werden, indem die App eine explizite BindGrid-Bindung an eine beliebige Page_Load-Methode durchführt, die diese Bedingungen erfüllt (System.Web.UI.WebControls.GridView befindet sich auf der letzten Seite und LastSystem.Web.UI.WebControls.GridView.PageSize unterscheidet sich von System.Web.UI.WebControls.GridView.PageSize). Alternativ kann die App so geändert werden, dass paging (anstelle von benutzerdefiniertem Paging) zugelassen wird, da in diesem Szenario das Problem nicht veranschaulicht wird.

Name Wert
Umfang Geringfügig
Version 4.5
Typ Laufzeit

Betroffene APIs

Kern

Ein in .NET Framework 4.5 mit NetDataContractSerializer serialisiertes ConcurrentDictionary kann nicht von .NET Framework 4.5.1 oder 4.5.2 deserialisiert werden.

Einzelheiten

Aufgrund von Typänderungen können ConcurrentDictionary<TKey,TValue>-Objekte, die unter Verwendung von System.Runtime.Serialization.NetDataContractSerializer mit .NET Framework 4.5 serialisiert werden, nicht in .NET Framework 4.5.1 oder 4.5.2 deserialisiert werden. Beachten Sie jedoch, dass die Serialisierung mit .NET Framework 4.5.x und die Deserialisierung mit .NET Framework 4.5 funktionieren. Genauso funktioniert die versionsübergreifende Serialisierung in .NET Framework 4.x mit .NET Framework 4.6. Dies hat keine Auswirkungen auf die (De-)Serialisierung einer einzelnen Version von .NET Framework.

Vorschlag

Wenn es erforderlich ist, System.Collections.Concurrent.ConcurrentDictionary<TKey,TValue> zwischen .NET Framework 4.5 und .NET Framework 4.5.1/4.5.2 zu serialisieren und zu deserialisieren, sollte ein anderer Serialisierer wie System.Runtime.Serialization.DataContractSerializer anstelle von System.Runtime.Serialization.NetDataContractSerializer verwendet werden. Da dieses Problem in .NET Framework 4.6 behoben ist, kann es durch ein Upgrade auf diese Version von .NET Framework behoben werden.

Name Wert
Umfang Geringfügig
Version 4.5.1
Typ Laufzeit

Betroffene APIs

Kann nicht über API-Analyse erkannt werden.

AppDomainSetup.DynamicBase wird von UseRandomizedStringHashAlgorithm nicht mehr randomisiert.

Einzelheiten

Vor dem .NET Framework 4.6 wurde der Wert von DynamicBase zufällig zwischen Anwendungsdomänen oder Prozessen geändert, wenn UseRandomizedStringHashAlgorithm in der Konfigurationsdatei der App aktiviert war. Ab .NET Framework 4.6 DynamicBase gibt ein stabiles Ergebnis zwischen verschiedenen Instanzen einer ausgeführten App und zwischen verschiedenen App-Domänen zurück. Dynamische Basen werden sich für verschiedene Apps immer noch unterscheiden. Diese Änderung entfernt das zufällige Benennungselement für verschiedene Instanzen derselben App.

Vorschlag

Beachten Sie, dass die Aktivierung von UseRandomizedStringHashAlgorithm nicht dazu führt, dass DynamicBase randomisiert wird. Wenn eine zufällige Basis erforderlich ist, muss sie nicht über diese API, sondern im Code Ihrer App erstellt werden.

Name Wert
Umfang Rand
Version 4.6
Typ Laufzeit

Betroffene APIs

Durch das Aufrufen von "Attribute.GetCustomAttributes" auf einer Indexereigenschaft wird keine "AmbiguousMatchException" mehr ausgelöst, wenn die Mehrdeutigkeit durch den Typ des Indexes aufgelöst werden kann.

Einzelheiten

Vor dem .NET Framework 4.6 führte das Aufrufen von GetCustomAttribute(s) bei einer Indexereigenschaft, die sich nur durch den Typ des Indexes von einer anderen Eigenschaft unterscheidet, zu einem System.Reflection.AmbiguousMatchException. Ab .NET Framework 4.6 werden die Attribute der Eigenschaft ordnungsgemäß zurückgegeben.

Vorschlag

Beachten Sie, dass GetCustomAttribute(s) jetzt häufiger funktioniert. Wenn sich eine App zuvor auf System.Reflection.AmbiguousMatchException verlassen hat, sollte jetzt die Reflektion verwendet werden, um stattdessen explizit nach mehreren Indexern zu suchen.

Name Wert
Umfang Rand
Version 4.6
Typ Laufzeit

Betroffene APIs

COR_PRF_GC_ROOT_HANDLE-Elemente werden nicht vom Profiler aufgezählt

Einzelheiten

In .NET Framework v4.5.1 gibt die Profilerstellungs-API RootReferences2()COR_PRF_GC_ROOT_HANDLE fälschlicherweise nie zurück (sie werden stattdessen als COR_PRF_GC_ROOT_OTHER zurückgegeben). Dieses Problem wurde ab .NET Framework 4.6 behoben.

Vorschlag

Dieses Problem wurde in .NET Framework 4.6 behoben und kann durch ein Upgrade auf diese Version von .NET Framework behoben werden.

Name Wert
Umfang Geringfügig
Version 4.5.1
Typ Laufzeit

Betroffene APIs

Kann nicht über API-Analyse erkannt werden.

ETW EventListeners erfassen keine Ereignisse von Anbietern mit expliziten Schlüsselwörtern (z. B. dem TPL-Anbieter)

Einzelheiten

ETW-EventListener mit einer leeren Schlüsselwortmaske erfassen keine Ereignisse von Providern mit expliziten Schlüsselwörtern. Im .NET Framework 4.5 begann der TPL-Anbieter explizite Schlüsselwörter bereitzustellen und löste dieses Problem aus. In .NET Framework 4.6 wurden EventListener aktualisiert, damit dieses Problem nicht mehr besteht.

Vorschlag

Um dieses Problem zu umgehen, ersetzen Sie Aufrufe an EnableEvents(EventSource, EventLevel) durch Aufrufe der EnableEvents-Überladung, die explizit die zu verwendende Maske "beliebige Schlüsselwörter" angibt: EnableEvents(eventSource, level, unchecked((EventKeywords)0xFFFFffffFFFFffff)).

Alternativ wurde dieses Problem in .NET Framework 4.6 behoben und kann durch ein Upgrade auf diese Version von .NET Framework behoben werden.

Name Wert
Umfang Rand
Version 4.5
Typ Laufzeit

Betroffene APIs

Der persische Kalender verwendet jetzt den Hijri-Solaralgorithmus.

Einzelheiten

Ab .NET Framework 4.6 verwendet die System.Globalization.PersianCalendar Klasse den Hijri-Solaralgorithmus. Das Konvertieren von Datumsangaben zwischen den System.Globalization.PersianCalendar und anderen Kalendern kann zu einem etwas anderen Ergebnis führen, beginnend mit dem .NET Framework 4.6 für Datumsangaben vor 1800 oder nach 2023 (Gregorian). Auch ist jetzt PersianCalendar.MinSupportedDateTimeMarch 22, 0622 anstelle von March 21, 0622.

Vorschlag

Beachten Sie, dass einige frühe oder späte Datumsangaben bei Verwendung von PersischCalendar in .NET Framework 4.6 geringfügig unterschiedlich sein können. Beim Serialisieren von Datumsangaben zwischen Prozessen, die möglicherweise in verschiedenen .NET Framework-Versionen ausgeführt werden, speichern Sie sie nicht als Persercalendar-Datumszeichenfolgen (da diese Werte möglicherweise unterschiedlich sind).

Name Wert
Umfang Geringfügig
Version 4.6
Typ Laufzeit

Betroffene APIs

Reflection-Objekte können nicht mehr von verwaltetem Code an Out-of-Process-DCOM-Clients übergeben werden.

Einzelheiten

Reflection-Objekte können nicht mehr von verwaltetem Code an Out-of-Process-DCOM-Clients übergeben werden. Die folgenden Typen sind betroffen:

Aufrufe an IMarshal für das Objekt geben E_NOINTERFACE zurück.

Vorschlag

Aktualisieren Sie Marshaling-Code, um mit Nicht-Spiegelungsobjekten zu arbeiten.

Name Wert
Umfang Geringfügig
Version 4.6
Typ Laufzeit

Betroffene APIs

TargetFrameworkName für die Standardanwendungsdomäne erhält nicht mehr standardmäßig den Wert NULL, wenn kein Wert festgelegt wurde

Einzelheiten

Die System.AppDomainSetup.TargetFrameworkName Datei war zuvor null in der Standard-App-Domäne, es sei denn, sie wurde explizit festgelegt. Ab 4.6 hat die System.AppDomainSetup.TargetFrameworkName Eigenschaft für die Standard-App-Domäne einen Standardwert, der vom TargetFrameworkAttribute abgeleitet ist (sofern vorhanden). Nicht standardmäßige App-Domänen erben weiterhin ihre System.AppDomainSetup.TargetFrameworkName von der Standard-App-Domäne (die in 4.6 nicht standardmäßig null ist), es sei denn, sie wird explizit außer Kraft gesetzt.

Vorschlag

Der Code sollte aktualisiert werden, damit er nicht von TargetFrameworkName der Standardeinstellung auf NULL abhängt. Wenn es erforderlich ist, dass diese Eigenschaft weiterhin auf NULL ausgewertet wird, kann sie explizit auf diesen Wert festgelegt werden.

Name Wert
Umfang Rand
Version 4.6
Typ Laufzeit

Betroffene APIs

X509Certificate2.ToString(Boolean) wird jetzt nicht ausgelöst, wenn .NET das Zertifikat nicht verarbeiten kann

Einzelheiten

Zuvor wurde diese Methode in .NET Framework 4.5.2 ausgelöst, wenn true für den ausführlichen Parameter übergeben wurde und Zertifikate installiert waren, die von .NET Framework nicht unterstützt wurden. Die Methode wird erfolgreich sein und gibt eine gültige Zeichenfolge zurück, die die nicht zugänglichen Teile des Zertifikats weglässt.

Vorschlag

Jeder von X509Certificate2.ToString(Boolean) abhängige Code sollte aktualisiert werden, um zu erwarten, dass die zurückgegebene Zeichenfolge einige Zertifikatsdaten in einigen Fällen ausschließt (z.B. den öffentlichen Schlüssel, den privaten Schlüssel und die Erweiterungen), in denen zuvor die API ausgelöst worden wäre.

Name Wert
Umfang Rand
Version 4.6
Typ Laufzeit

Betroffene APIs

Daten

Beim Versuch, eine TCP/IP-Verbindung zu einer SQL Server-Datenbank herzustellen, die auf localhost aufgelöst wird, schlägt dies fehl.

Einzelheiten

Versuchen Sie in .NET Framework 4.6 und 4.6.1, eine TCP/IP-Verbindung mit einer SQL Server-Datenbank herzustellen, die zu localhost aufgelöst wird. Dies schlägt mit dem Fehler "Beim Herstellen einer Verbindung mit SQL Server ist ein netzwerkbezogener oder instanzspezifischer Fehler aufgetreten." fehl. Der Server wurde nicht gefunden oder war nicht zugänglich. Vergewissern Sie sich, dass der Instanzname korrekt ist und SQL Server so konfiguriert ist, dass Remoteverbindungen zulässig sind. (Anbieter: SQL-Netzwerkschnittstellen, Fehler: 26 – Fehler beim Auffinden des angegebenen Servers/der angegebenen Instanz)")

Vorschlag

Dieses Problem wurde behoben und das vorherige Verhalten in .NET Framework 4.6.2 wiederhergestellt. Zum Herstellen einer Verbindung zu einer SQL Server-Datenbank, die auf localhost verweist, aktualisieren Sie auf das .NET Framework 4.6.2.

Name Wert
Umfang Geringfügig
Version 4.6
Typ Laufzeit

Betroffene APIs

Kann nicht über API-Analyse erkannt werden.

Debugger

Null-Koalescerwerte sind im Debugger erst nach einem weiteren Schritt sichtbar.

Einzelheiten

Ein Fehler im .NET Framework 4.5 bewirkt, dass Werte, die über einen Null-Koalierungsvorgang festgelegt wurden, im Debugger nicht sofort sichtbar sind, nachdem der Zuordnungsvorgang ausgeführt wird, wenn er in der 64-Bit-Version des Framework ausgeführt wird.

Vorschlag

Wenn Sie einen weiteren Schritt im Debugger ausführen, wird der Wert der lokalen Variablen bzw. des Feldes korrekt aktualisiert. Außerdem wurde dieses Problem in .NET Framework 4.6 behoben. Ein Upgrade auf diese Version des Frameworks sollte das Problem lösen.

Name Wert
Umfang Rand
Version 4.5
Typ Laufzeit

Betroffene APIs

Kann nicht über API-Analyse erkannt werden.

Vernetzung

ContentDisposition DateTimes gibt leicht unterschiedliche Zeichenfolgen zurück.

Einzelheiten

Die Zeichenfolgendarstellungen von System.Net.Mime.ContentDisposition wurden ab Version 4.6 aktualisiert, um die Stundenkomponente von System.DateTime immer mit zwei Ziffern darzustellen. Dies ist die Einhaltung von RFC822 und RFC2822. Dies bewirkt, dass ToString() in Version 4.6 eine etwas andere Zeichenfolge in Szenarien zurückgibt, bei denen eines der Zeitelemente der Anordnung vor 10:00 Uhr liegt. Beachten Sie, dass ContentDispositions manchmal serialisiert werden, indem sie in Zeichenfolgen konvertiert werden, sodass alle ToString() Vorgänge, Serialisierung oder GetHashCode-Aufrufe überprüft werden sollten.

Vorschlag

Erwarten Sie nicht, dass Zeichenfolgendarstellungen von ContentDispositions aus verschiedenen .NET Framework-Versionen ordnungsgemäß miteinander verglichen werden. Konvertieren Sie die Zeichenfolgen, wenn möglich, zurück in ContentDispositions, bevor Sie einen Vergleich durchführen.

Name Wert
Umfang Geringfügig
Version 4.6
Typ Laufzeit

Betroffene APIs

Serialisierung

Die Ausnahmemeldung für fehlgeschlagene DataContract-Serialisierungen im Fall eines unbekannten Typs hat sich geändert

Einzelheiten

Ab .NET Framework 4.6 wurde die Ausnahmemeldung konkretisiert, wenn aufgrund fehlender "bekannter Typen" eine System.Runtime.Serialization.DataContractSerializer nicht serialisiert oder System.Runtime.Serialization.Json.DataContractJsonSerializer nicht deserialisiert werden kann.

Vorschlag

Apps sollten nicht von bestimmten Ausnahmemeldungen abhängen. Wenn eine App von dieser Nachricht abhängig ist, aktualisieren Sie sie entweder so, dass die neue Nachricht erwartet wird, oder (vorzugsweise) ändern, damit sie nur vom Ausnahmetyp abhängt.

Name Wert
Umfang Rand
Version 4.6
Typ Laufzeit

Betroffene APIs

Setup und Bereitstellung

Produktversionsänderungen in .NET Framework 4.6 und höheren Versionen

Einzelheiten

Die Produktversionierung hat sich im Vergleich zu den vorherigen Versionen des .NET Frameworks und insbesondere von .NET Framework 4, 4.5, 4.5.1 und 4.5.2 geändert. Im Folgenden sind die detaillierten Änderungen aufgeführt:

  • Der Wert des Version Eintrags im HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full Schlüssel hat sich für das .NET Framework 4.6 und seine Point-Releases in 4.6.xxxxx geändert und für das .NET Framework 4.7 und 4.7.1 in 4.7.xxxxx. In .NET Framework 4.5, 4.5.1 und 4.5.2 hatte es das Format 4.5.xxxxx.
  • Die Datei- und Produktversionsverwaltung für .NET Framework-Dateien wurde von dem früheren Versionsverwaltungsschema von 4.0.30319.x in 4.6.X.0 für .NET Framework 4.6 und deren Punktversionen und in 4.7.X.0 für .NET Framework 4.7 und 4.7.1 geändert. Sie können diese neuen Werte sehen, wenn Sie die Eigenschaften der Datei anzeigen, nachdem Sie mit der rechten Maustaste auf eine Datei geklickt haben.
  • Die Attribute AssemblyFileVersionAttribute und AssemblyInformationalVersionAttribute für verwaltete Assemblys haben Versionswerte in der Form 4.6.X.0 für das .NET Framework 4.6 und dessen Zwischenversionen sowie 4.7.X.0 für das .NET Framework 4.7 und 4.7.1.
  • In .NET Framework 4.6, 4.6.1, 4.6.2, 4.7 und 4.7.1 gibt die Environment.Version Eigenschaft die Zeichenfolge 4.0.30319.42000der festen Version zurück. In .NET Framework 4, 4.5, 4.5.1 und 4.5.2 werden Versionszeichenfolgen im Format 4.0.30319.xxxxx zurückgegeben (z. B. "4.0.30319.18010"). Bitte beachten Sie, dass wir nicht empfehlen, dass Anwendungscode eine neue Abhängigkeit von der Eigenschaft "Environment.Version" eingeht.

Weitere Informationen finden Sie unter Wie man feststellt, welche .NET Framework-Versionen installiert sind.

Vorschlag

Im Allgemeinen sollten Anwendungen von den empfohlenen Techniken abhängen, um z. B. die Laufzeitversion von .NET Framework und das Installationsverzeichnis zu erkennen:

  • Informationen zum Ermitteln der Laufzeitversion von .NET Framework finden Sie unter How to: Determine Which .NET Framework Versions Are Installed.
  • Verwenden Sie den Wert des InstallPath Eintrags im HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full Schlüssel, um den Installationspfad für .NET Framework zu ermitteln.

Von Bedeutung

Der Unterschlüsselname lautet NET Framework Setup, nicht .NET Framework Setup.

  • Rufen Sie die Methode RuntimeEnvironment.GetRuntimeDirectory() auf, um den Verzeichnispfad zur .NET Framework Common Language Runtime zu ermitteln.
  • Um die CLR-Version abzurufen, rufen Sie die Methode RuntimeEnvironment.GetSystemVersion() auf. Für .NET Framework 4 und deren Punktversionen (.NET Framework 4.5, 4.5.1, 4.5.2 und .NET Framework 4.6, 4.6.1, 4.6.2, 4.7 und 4.7.1) gibt sie die Zeichenfolge v4.0.30319 zurück.
Name Wert
Umfang Geringfügig
Version 4.6
Typ Laufzeit

Betroffene APIs

Kann nicht über API-Analyse erkannt werden.

.NET Framework 4.6 verwendet bei seiner Registrierung in der Registrierungsdatenbank keine 4.5.x.x-Version.

Einzelheiten

Wie erwartet, beginnt der in der Registrierung (at HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\NET Framework Setup\NDP\v4\Full) für .NET Framework 4.6 festgelegte Versionsschlüssel mit '4.6', nicht mit '4.5'. Apps, die von diesen Registrierungsschlüsseln abhängen, um zu wissen, welche .NET Framework-Versionen auf einem Computer installiert sind, sollten aktualisiert werden, um zu verstehen, dass 4.6 eine neue mögliche Version ist und eine, die mit früheren 4.5.x-Versionen kompatibel ist.

Vorschlag

Aktualisieren Sie Apps für eine .NET Framework 4.5-Installation, indem Sie nach 4.5-Registrierungsschlüsseln suchen, um auch 4.6 zu akzeptieren.

Name Wert
Umfang Rand
Version 4.6
Typ Laufzeit

Betroffene APIs

Kann nicht über API-Analyse erkannt werden.

Windows Communication Foundation (WCF)

WCF-Dienste, die NETTCP mit SSL-Sicherheit und MD5-Zertifikatauthentifizierung verwenden

Einzelheiten

.NET Framework 4.6 fügt TLS 1.1 und TLS 1.2 zur WCF SSL-Standardprotokollliste hinzu. Wenn sowohl Client- als auch Servercomputer .NET Framework 4.6 oder höher installiert haben, wird TLS 1.2 für die Aushandlung verwendet. TLS 1.2 unterstützt keine MD5-Zertifikatauthentifizierung. Wenn ein Kunde ein MD5-Zertifikat verwendet, kann der WCF-Client daher keine Verbindung mit dem WCF-Dienst herstellen.

Vorschlag

Sie können dieses Problem umgehen, damit ein WCF-Client eine Verbindung mit einem WCF-Server herstellen kann, indem Sie eine der folgenden Aktionen ausführen:

  • Aktualisieren Sie das Zertifikat so, dass der MD5-Algorithmus nicht verwendet wird. Dies ist die empfohlene Lösung.
  • Wenn die Bindung nicht dynamisch im Quellcode konfiguriert ist, aktualisieren Sie die Konfigurationsdatei der Anwendung so, dass TLS 1.1 oder eine frühere Version des Protokolls verwendet wird. Auf diese Weise können Sie weiterhin ein Zertifikat mit dem MD5-Hashalgorithmus verwenden.

Warnung

Diese Problemumgehung wird nicht empfohlen, da ein Zertifikat mit dem MD5-Hashalgorithmus als unsicher betrachtet wird.

Die folgende Konfigurationsdatei führt dies aus:

<configuration>
  <system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding>
          <security mode= "None/Transport/Message/TransportWithMessageCredential" >
            <transport clientCredentialType="None/Windows/Certificate"
                       protectionLevel="None/Sign/EncryptAndSign"
                       sslProtocols="Ssl3/Tls1/Tls11">
            </transport>
          </security>
        </binding>
      </netTcpBinding>
    </bindings>
  </system.ServiceModel>
</configuration>

Warnung

Diese Problemumgehung wird nicht empfohlen, da ein Zertifikat mit dem MD5-Hashalgorithmus als unsicher betrachtet wird.

Name Wert
Umfang Geringfügig
Version 4.6
Typ Laufzeit

Betroffene APIs

Kann nicht über API-Analyse erkannt werden.

Windows Presentation Foundation (WPF)

Der Zugriff auf die ausgewählten Elemente eines WPF-DataGrid-Steuerelements über einen Handler des UnloadingRow-Ereignisses kann eine NullReferenceException auslösen

Einzelheiten

Aufgrund eines Fehlers in .NET Framework 4.5 können Ereignishandler für DataGrid-Ereignisse, die das Entfernen einer Zeile umfassen, eine System.NullReferenceException auslösen, die ausgelöst werden soll, wenn auf die DataGrid- oder System.Windows.Controls.Primitives.Selector.SelectedItem-Eigenschaft von System.Windows.Controls.Primitives.MultiSelector.SelectedItems zugegriffen wird.

Vorschlag

Dieses Problem wurde in .NET Framework 4.6 behoben und kann durch ein Upgrade auf diese Version von .NET Framework behoben werden.

Name Wert
Umfang Geringfügig
Version 4.5
Typ Laufzeit

Betroffene APIs

Das Aufrufen von Items.Refresh für ein WPF ListBox-, ListView- oder DataGrid-Element mit ausgewählten Elementen kann dazu führen, dass doppelte Elemente im Element angezeigt werden.

Einzelheiten

Im .NET Framework 4.5 kann das Aufrufen von ListBox.Items.Refresh aus Code, während Elemente in einem System.Windows.Controls.ListBox Element ausgewählt sind, dazu führen, dass die ausgewählten Elemente in der Liste dupliziert werden. Bei System.Windows.Controls.ListView und System.Windows.Controls.DataGrid tritt ein ähnliches Problem auf. Dies wurde in .NET Framework 4.6 behoben.

Vorschlag

Dieses Problem kann behoben werden, indem die Auswahl von Elementen vor dem System.Windows.Data.CollectionView.Refresh() Aufruf programmgesteuert deaktiviert und nach Abschluss des Anrufs erneut ausgewählt wird. Alternativ wurde dieses Problem in .NET Framework 4.6 behoben und kann durch ein Upgrade auf diese Version von .NET Framework behoben werden.

Wert
Bereich Geringfügig
Version 4.5
Typ Laufzeit

Betroffene APIs

KoerceIsSelectionBoxHighlighted

Einzelheiten

Bestimmte Abläufe von Aktionen, die eine System.Windows.Controls.ComboBox und ihre Datenquelle involvieren, können zu einer System.NullReferenceException führen.

Vorschlag

Aktualisieren Sie nach Möglichkeit auf .NET Framework 4.6.2.

Name Wert
Umfang Geringfügig
Version 4.6
Typ Laufzeit

Betroffene APIs

IsSelected-Bindungsfehler für ListBoxItem mit ObservableCollection<T>.Move

Einzelheiten

Das Aufrufen von Move(Int32, Int32) oder MoveItem(Int32, Int32) bei einer Sammlung, die an eine System.Windows.Controls.ListBox mit ausgewählten Elementen gebunden ist, kann zu einem fehlerhaften Verhalten bei zukünftiger Auswahl oder dem Aufheben der Auswahl von System.Windows.Controls.ListBox-Elementen führen.

Vorschlag

Der Aufruf von System.Collections.ObjectModel.Collection<T>.Remove(T) und System.Collections.ObjectModel.Collection<T>.Insert(Int32, T) anstelle von Move(Int32, Int32) wird dieses Problem umgehen. Alternativ wurde dieses Problem in .NET Framework 4.6 behoben und kann durch ein Upgrade auf diese Version von .NET Framework behoben werden.

Name Wert
Umfang Geringfügig
Version 4.5
Typ Laufzeit

Betroffene APIs

Wenn Sie mit der rechten Maustaste auf eine WPF DataGrid-Zeilenüberschrift klicken, wird die DataGrid-Auswahl geändert.

Einzelheiten

Wenn Sie mit der rechten Maustaste auf eine markierte System.Windows.Controls.DataGrid Zeilenüberschrift klicken, während mehrere Zeilen markiert sind, ändert sich die System.Windows.Controls.DataGrid-Auswahl nur auf diese Zeile.

Vorschlag

Dieses Problem wurde in .NET Framework 4.6 behoben und kann durch ein Upgrade auf diese Version von .NET Framework behoben werden.

Name Wert
Umfang Rand
Version 4.5
Typ Laufzeit

Betroffene APIs

WPF startet einen wisptis.exe-Prozess, der die Maus einfrieren kann.

Einzelheiten

Mit Version 4.5.2 wurde ein Problem eingeführt, durch das wisptis.exe erzeugt wird. Hierdurch kann die Mauseingabe gesperrt werden.

Vorschlag

Ein Fix für dieses Problem ist in einer Wartungsversion von .NET Framework 4.5.2 (Hotfixrollup 3026376) oder durch Upgrade auf .NET Framework 4.6 verfügbar.

Name Wert
Umfang Haupt
Version 4.5.2
Typ Laufzeit

Betroffene APIs

Kann nicht über API-Analyse erkannt werden.

Die WPF-Rechtschreibprüfung in textfähigen Steuerelementen funktioniert in Windows 10 nicht für Sprachen, die nicht in der Eingabesprachenliste des Betriebssystems enthalten sind.

Einzelheiten

Wenn die Rechtschreibprüfung unter Windows 10 ausgeführt wird, funktioniert die Rechtschreibprüfung möglicherweise nicht für WPF-Text-fähige Steuerelemente, da plattformbasierte Rechtschreibprüfungsfunktionen nur für Sprachen verfügbar sind, die in der Liste der Eingabesprachen vorhanden sind. Wenn in Windows 10 eine Sprache zur Liste der verfügbaren Tastaturen hinzugefügt wird, lädt Windows automatisch ein entsprechendes Feature on Demand (FOD)-Paket herunter und installiert es, das Die Rechtschreibprüfungsfunktionen bereitstellt. Durch Hinzufügen der Sprache zur Liste der Eingabesprachen wird die Rechtschreibprüfung unterstützt.

Vorschlag

Beachten Sie, dass die zu überprüfende Sprache oder der Text als Eingabesprache für die Rechtschreibprüfung in Windows 10 hinzugefügt werden muss.

Name Wert
Umfang Rand
Version 4.6
Typ Laufzeit

Betroffene APIs

Kann nicht über API-Analyse erkannt werden.

WPF-Fenster werden ohne Clipping gerendert, wenn diese die Größe eines einzelnen Monitors überschreiten

Einzelheiten

In .NET Framework 4.6, das unter Windows 8 und höher ausgeführt wird, wird das gesamte Fenster ohne Beschnitt gerendert, wenn es außerhalb der einzelnen Anzeige in einem Szenario mit mehreren Monitoren erweitert wird. Dies unterscheidet sich von früheren Versionen von .NET Framework, bei denen WPF-Fenster beschnitten werden, die eine einzelne Anzeige überschreiten.

Vorschlag

Dieses Verhalten (ob ausgeschnitten wird oder nicht) kann durch das <EnableMultiMonitorDisplayClipping>-Element in der <appSettings>-Konfigurationsdatei einer Anwendung oder durch Einstellen der EnableMultiMonitorDisplayClipping-Eigenschaft beim Start der App explizit festgelegt werden.

Name Wert
Umfang Geringfügig
Version 4.6
Typ Laufzeit

Betroffene APIs

Kann nicht über API-Analyse erkannt werden.

.NET Framework 4.6.1

Werkzeuge

Contract.Invariant oder Contract.Requires<TException> erkennt „String.IsNullOrEmpty“ nicht als reinen Wert an.

Einzelheiten

Für Apps, die auf das .NET Framework 4.6.1 abzielen, gibt der Rewriter die Compilerwarnung CC1036 aus, wenn entweder der invariante Vertrag für Contract.Invariant oder der Vorbedingungsvertrag für Requires die Methode String.IsNullOrEmpty aufruft. Dabei wird „System.String.IsNullOrWhiteSpace(System.String)“ ohne [Pure] in der Methode aufgerufen. Dies ist eine Compilerwarnung und kein Compilerfehler.

Vorschlag

Dieses Verhalten wurde in GitHub Issue #339 behoben. Um diese Warnung zu beseitigen, können Sie eine aktualisierte Version des Quellcodes für das Codeverträge-Tool von GitHub herunterladen und kompilieren. Downloadinformationen finden Sie unten auf der Seite.

Name Wert
Umfang Geringfügig
Version 4.6.1
Typ Laufzeit

Betroffene APIs

Windows Presentation Foundation (WPF)

Elementscrolling durch eine flache Liste mit Elementen mit unterschiedlicher Pixelhöhe

Einzelheiten

Wenn ein System.Windows.Controls.ItemsControl-Element eine Sammlung mithilfe von Virtualisierung (IsVirtualizing=true) und Elementscrolling (ScrollUnit=Item) anzeigt, und wenn das Steuerelement gescrollt wird, um ein Element anzuzeigen, dessen Größe in Pixeln sich von dessen Nachbarn unterscheidet, durchläuft System.Windows.Controls.VirtualizingStackPanel alle Elemente in der Sammlung. Die Benutzeroberfläche reagiert während dieser Iteration nicht. Die Iteration erfolgt unter anderen Umständen auch in früheren .NET Framework-Versionen. Sie tritt z.B. beim Scrollen von Pixeln (ScrollUnit=Pixel) auf, nachdem ein Element mit einer anderen Pixelhöhe erkannt wurde sowie beim Elementscrolling für hierarchische Daten (wie beim System.Windows.Controls.TreeView-Steuerelement oder einem System.Windows.Controls.ItemsControl-Element mit aktivierter Gruppierung), nachdem bei einem Element eine andere Anzahl von Nachfolgerelementen als bei seinen Nachbarn erkannt wurde. Im Fall des Elementscrollings bei unterschiedlicher Pixelhöhe wurde die Iteration in .NET Framework 4.6.1 eingeführt, um Fehler im Layout der hierarchischen Daten zu beheben. Es ist nicht erforderlich, wenn die Daten flach (keine Hierarchie) sind, und .NET Framework 4.6.2 tut dies in diesem Fall nicht.

Vorschlag

Wenn die Iteration in .NET Framework 4.6.1, aber nicht in früheren Releases auftritt, also wenn System.Windows.Controls.ItemsControl das Elementscrolling in einer flachen Liste von Elementen mit unterschiedlicher Pixelhöhe durchführt, gibt es zwei Lösungen:

  • Installieren Sie .NET Framework 4.6.2.
  • Installieren Sie Hotfix HR 1605 für .NET Framework 4.6.1.
Name Wert
Umfang Geringfügig
Version 4.6.1
Typ Laufzeit

Betroffene APIs

ObjectDisposedException wird von WPF-Rechtschreibprüfung ausgelöst

Einzelheiten

WPF-Anwendungen stürzen gelegentlich während des Herunterfahrens der Anwendung ab, wobei System.ObjectDisposedException die Rechtschreibprüfung ausgelöst wird. Dies wurde in .NET Framework 4.7 WPF behoben, indem die Ausnahme ordnungsgemäß behandelt wird und somit sichergestellt wird, dass Anwendungen nicht mehr negativ betroffen sind. Es sollte beachtet werden, dass First-Chance-Ausnahmen gelegentlich weiterhin in Anwendungen festgestellt werden, die unter einem Debugger ausgeführt werden.

Vorschlag

Upgrade auf .NET Framework 4.7

Name Wert
Umfang Rand
Version 4.6.1
Typ Laufzeit

Betroffene APIs

Kann nicht über API-Analyse erkannt werden.

Die Fehler bei der WPF-Rechtschreibprüfung treten auf unerwartete Art und Weise auf.

Einzelheiten

Dies umfasst eine Reihe von WPF-Rechtschreibprüfungsproblemen:

  • Die WPF-Rechtschreibprüfungs-API löst manchmal System.Runtime.InteropServices.COMException aus
  • Die WPF-Rechtschreibprüfung schlägt mit UnauthorizedAccessException fehl, wenn Anwendungen mithilfe von "Als anderer Benutzer ausführen" gestartet werden.
  • Die WPF-Rechtschreibprüfung identifiziert Rechtschreibfehler falsch in zusammengesetzten Wörtern wie "Hausnummer" in Deutsch.

Vorschlag

Problem Nr. 1 – Dies wurde in .NET Framework 4.6.2 Problem #2 behoben. Die WPF-Rechtschreibprüfung wird nicht mehr unterstützt, wenn Anwendungen mit "Als anderer Benutzer ausgeführt" gestartet werden. Ab .NET Framework 4.6.2 stürzt anwendungen, die auf diese Weise gestartet wurden, nicht mehr unerwartet ab. Stattdessen wird die Rechtschreibprüfung im Hintergrund deaktiviert. Problem #3 – Dies wurde in .NET Framework 4.6.2 behoben.

Name Wert
Umfang Rand
Version 4.6.1
Typ Laufzeit

Betroffene APIs

Kann nicht über API-Analyse erkannt werden.

.NET Framework 4.6.2

Daten

Beim Versuch, eine TCP/IP-Verbindung zu einer SQL Server-Datenbank herzustellen, die auf localhost aufgelöst wird, schlägt dies fehl.

Einzelheiten

Versuchen Sie in .NET Framework 4.6 und 4.6.1, eine TCP/IP-Verbindung mit einer SQL Server-Datenbank herzustellen, die zu localhost aufgelöst wird. Dies schlägt mit dem Fehler "Beim Herstellen einer Verbindung mit SQL Server ist ein netzwerkbezogener oder instanzspezifischer Fehler aufgetreten." fehl. Der Server wurde nicht gefunden oder war nicht zugänglich. Vergewissern Sie sich, dass der Instanzname korrekt ist und SQL Server so konfiguriert ist, dass Remoteverbindungen zulässig sind. (Anbieter: SQL-Netzwerkschnittstellen, Fehler: 26 – Fehler beim Auffinden des angegebenen Servers/der angegebenen Instanz)")

Vorschlag

Dieses Problem wurde behoben und das vorherige Verhalten in .NET Framework 4.6.2 wiederhergestellt. Zum Herstellen einer Verbindung zu einer SQL Server-Datenbank, die auf localhost verweist, aktualisieren Sie auf das .NET Framework 4.6.2.

Name Wert
Umfang Geringfügig
Version 4.6
Typ Laufzeit

Betroffene APIs

Kann nicht über API-Analyse erkannt werden.

Blockierungszeitraum für Verbindungspools für Azure SQL-Datenbanken wird entfernt

Einzelheiten

Ab .NET Framework 4.6.2 wird für Verbindungsöffnungsanforderungen an bekannte Azure SQL-Datenbanken (*.database.windows.net, *.database.chinacloudapi.cn, *.database.usgovcloudapi.net, *.database.cloudapi.de) der Sperrzeitraum für Verbindungspools entfernt, und Verbindungsöffnungsfehler werden nicht zwischengespeichert. Versuche, geöffnete Verbindungsanforderungen erneut zu versuchen, treten fast unmittelbar nach vorübergehenden Verbindungsfehlern auf. Diese Änderung ermöglicht die sofortige Wiederholung eines Versuchs zum Öffnen einer Verbindung mit Azure SQL-Datenbanken. Dadurch wird die Leistung von cloudfähigen Apps verbessert. Für alle anderen Verbindungsversuche wird die Sperrfrist für den Verbindungspool weiterhin erzwungen.

In .NET Framework 4.6.1 und früheren Versionen, wenn eine App auf einen vorübergehenden Verbindungsfehler beim Herstellen einer Verbindung zu einer Datenbank stößt, kann der Verbindungsversuch nicht schnell wiederholt werden, da der Verbindungspool den Fehler zwischenspeichert und ihn für 5 Sekunden bis 1 Minute erneut auslöst. Weitere Informationen finden Sie unter SQL Server-Verbindungspooling (ADO.NET). Dieses Verhalten ist für Verbindungen mit Azure SQL-Datenbanken problematisch, die häufig aufgrund vorübergehender Fehler fehlschlagen, die in der Regel innerhalb weniger Sekunden behoben sind. Das Feature zum Blockieren des Verbindungspools bedeutet, dass die App für einen längeren Zeitraum keine Verbindung mit der Datenbank herstellen kann, obwohl die Datenbank verfügbar ist und die App innerhalb weniger Sekunden gerendert werden muss.

Vorschlag

Wenn dieses Verhalten nicht erwünscht ist, können Sie den Blockierungszeitraum für den Verbindungspool konfigurieren, indem Sie die System.Data.SqlClient.SqlConnectionStringBuilder.PoolBlockingPeriod in .NET Framework 4.6.2 eingeführte Eigenschaft festlegen. Der Wert der Eigenschaft ist ein Element der System.Data.SqlClient.PoolBlockingPeriod Aufzählung, die einen von drei Werten annehmen kann:

Sie können das vorherige Verhalten wiederherstellen, indem Sie die System.Data.SqlClient.SqlConnectionStringBuilder.PoolBlockingPeriod-Eigenschaft auf AlwaysBlock setzen.

Name Wert
Umfang Geringfügig
Version 4.6.2
Typ Laufzeit

Betroffene APIs

Globalisierung

Unicode-Standardversion 8.0-Kategorien werden jetzt unterstützt

Einzelheiten

In .NET Framework 4.6.2 wurden Unicode-Daten von Unicode Standard Version 6.3 auf Version 8.0 aktualisiert. Beim Anfordern von Unicode-Zeichenkategorien in .NET Framework 4.6.2 stimmen einige Ergebnisse möglicherweise nicht mit den Ergebnissen in früheren .NET Framework-Versionen überein. Diese Änderung betrifft hauptsächlich Cherokee-Silben und Neu-Tai-Lue-Vokalzeichen sowie Tonmarkierungen.

Vorschlag

Überprüfen Sie Code, und entfernen/ändern Sie logik, die von hartcodierten Unicode-Zeichenkategorien abhängt.

Name Wert
Umfang Geringfügig
Version 4.6.2
Typ Laufzeit

Betroffene APIs

Sicherheit

RSACng und DSACng können in Szenarien mit teilweiser Vertrauensstellung wieder verwendet werden

Einzelheiten

CngLightup (verwendet in mehreren Krypto-APIs auf höherer Ebene, z. B. System.Security.Cryptography.Xml.EncryptedXml) und System.Security.Cryptography.RSACng sind in einigen Fällen auf vollständiges Vertrauen angewiesen. Dazu gehören P/Invokes ohne die Berechtigungen zu beanspruchenSecurityPermissionFlag.UnmanagedCode und Codepfade, für dieSystem.Security.Cryptography.CngKey Berechtigungsanforderungen geltenSecurityPermissionFlag.UnmanagedCode. Ab .NET Framework 4.6.2 wurde CngLightup verwendet, um nach Möglichkeit zu System.Security.Cryptography.RSACng wechseln. Daher begannen Apps mit teilweisem Vertrauen, bei denen System.Security.Cryptography.Xml.EncryptedXml erfolgreich verwendet wurde, zu fehlschlagen und SecurityException-Ausnahmen auszulösen. Diese Änderung fügt die erforderlichen Assertions hinzu, sodass alle Funktionen, die CngLightup verwenden, über die erforderlichen Berechtigungen verfügen.

Vorschlag

Wenn sich diese Änderung in .NET Framework 4.6.2 negativ auf Ihre teilweise vertrauenswürdigen Apps auswirkt, führen Sie ein Upgrade auf .NET Framework 4.7.1 durch.

Name Wert
Umfang Rand
Version 4.6.2
Typ Laufzeit

Betroffene APIs

RSACng.VerifyHash gibt jetzt False für alle Überprüfungsfehler zurück.

Einzelheiten

Ab .NET Framework 4.6.2 gibt diese Methode False zurück, wenn die Signatur selbst schlecht formatiert ist. Sie gibt nun für jeden Überprüfungsfehler FALSE zurück. In .NET Framework 4.6 und 4.6.1 löst diese Methode die Ausnahme System.Security.Cryptography.CryptographicException aus, wenn die Signatur selbst falsch formatiert ist.

Vorschlag

Jeder Code, dessen Ausführung von der System.Security.Cryptography.CryptographicException Behandlung abhängt, sollte stattdessen ausgeführt werden, wenn die Überprüfung fehlschlägt und die Methode False zurückgibt.

Name Wert
Umfang Geringfügig
Version 4.6.2
Typ Laufzeit

Betroffene APIs

Breaking Changes bei SignedXml und EncryptedXml

Einzelheiten

In .NET Framework 4.6.2 führen Sicherheitsfixes in System.Security.Cryptography.Xml.SignedXml und System.Security.Cryptography.Xml.EncryptedXml zu unterschiedlichen Laufzeitverhalten. Beispiel:

  • Wenn ein Dokument mehrere Elemente mit demselben id Attribut aufweist und eine Signatur auf eines dieser Elemente als Stamm der Signatur abzielt, wird das Dokument jetzt als ungültig betrachtet.
  • Dokumente, die nicht kanonische XPath-Transformationsalgorithmen in Verweisen verwenden, gelten jetzt als ungültig.
  • Dokumente, die nicht kanonische XSLT-Transformationsalgorithmen in Verweisen verwenden, werden jetzt als ungültig betrachtet.
  • Alle Programme, die externe ressourcentrennte Signaturen verwenden, können dies nicht tun.

Vorschlag

Entwickler möchten möglicherweise die Verwendung von XmlDsigXsltTransform und XmlDsigXsltTransformsowie Typen überprüfen, die von denen Transform abgeleitet werden, da ein Dokumentempfänger sie möglicherweise nicht verarbeiten kann.

Name Wert
Umfang Geringfügig
Version 4.6.2
Typ Laufzeit

Betroffene APIs

Windows Communication Foundation (WCF)

Entfernen von Ssl3 aus den WCF-TransportDefaults

Einzelheiten

Bei Verwendung von NetTcp mit Transportsicherheit und einem Zertifikattyp für Anmeldeinformationen ist das SSL 3-Protokoll kein Standardprotokoll mehr, das für die Aushandlung einer sicheren Verbindung verwendet wird. In den meisten Fällen sollte es keine Auswirkungen auf vorhandene Apps geben, da TLS 1.0 immer in die Protokollliste für NetTcp aufgenommen wurde. Alle vorhandenen Clients sollten in der Lage sein, eine Verbindung mit mindestens TLS1.0 auszuhandeln.

Vorschlag

Wenn Ssl3 erforderlich ist, verwenden Sie einen der folgenden Konfigurationsmechanismen, um der Liste der ausgehandelten Protokolle Ssl3 hinzuzufügen.

Name Wert
Umfang Rand
Version 4.6.2
Typ Laufzeit

Betroffene APIs

Windows Presentation Foundation (WPF)

Das Ändern der IsEnabled-Eigenschaft des übergeordneten Elements eines TextBlock-Steuerelements wirkt sich auf alle untergeordneten Steuerelemente aus

Einzelheiten

Ab .NET Framework 4.6.2 beeinflusst das Ändern der System.Windows.UIElement.IsEnabled-Eigenschaft des übergeordneten System.Windows.Controls.TextBlock-Steuerelements auch alle untergeordneten Steuerelemente (wie Hyperlinks und Schaltflächen) des System.Windows.Controls.TextBlock-Steuerelements. In .NET Framework 4.6.1 und früheren Versionen spiegelten Steuerelemente innerhalb eines System.Windows.Controls.TextBlock-Elements nicht immer den Zustand der System.Windows.UIElement.IsEnabled-Eigenschaft des System.Windows.Controls.TextBlock-übergeordneten Elements wider.

Vorschlag

Keiner. Diese Änderung entspricht dem erwarteten Verhalten für Steuerelemente innerhalb eines System.Windows.Controls.TextBlock Steuerelements.

Name Wert
Umfang Geringfügig
Version 4.6.2
Typ Laufzeit

Betroffene APIs

KoerceIsSelectionBoxHighlighted

Einzelheiten

Bestimmte Abläufe von Aktionen, die eine System.Windows.Controls.ComboBox und ihre Datenquelle involvieren, können zu einer System.NullReferenceException führen.

Vorschlag

Aktualisieren Sie nach Möglichkeit auf .NET Framework 4.6.2.

Name Wert
Umfang Geringfügig
Version 4.6
Typ Laufzeit

Betroffene APIs

DataGridCellsPanel.BringIndexIntoView löst ArgumentOutOfRangeException aus.

Einzelheiten

ScrollIntoView(Object) funktioniert asynchron, wenn die Spaltenvirtualisierung aktiviert ist, aber die Spaltenbreiten wurden noch nicht bestimmt. Wenn Spalten entfernt werden, bevor die asynchrone Arbeit erfolgt, kann ein System.ArgumentOutOfRangeException Fehler auftreten.

Vorschlag

Eine der folgenden Optionen:

  • Upgrade auf .NET Framework 4.7.
  • Installieren Sie den neuesten Wartungspatch für .NET Framework 4.6.2.
  • Vermeiden Sie das Entfernen von Spalten, bis die asynchrone Antwort auf ScrollIntoView(Object) abgeschlossen ist.
Name Wert
Umfang Rand
Version 4.6.2
Typ Laufzeit

Betroffene APIs

Horizontales Scrollen und Virtualisierung

Einzelheiten

Diese Änderung betrifft System.Windows.Controls.ItemsControl-Objekte mit eigener Virtualisierung in der senkrecht zur Hauptscrollrichtung stehenden Richtung (z. B. System.Windows.Controls.DataGrid mit EnableColumnVirtualization="True"). Das Ergebnis bestimmter horizontaler Bildlaufvorgänge wurde geändert, um Ergebnisse zu erzielen, die naheliegender und den Ergebnissen vergleichbarer vertikaler Vorgänge ähnlicher sind.

Zu den Vorgängen gehören „Bildlauf hierhin durchführen“ und „Rechter Rand“, 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 SetHorizontalOffset(Double) auf.

Nach dem Scrollen zum neuen Offset hat sich die Definition von „Hier“ oder „Rechter Rand“ möglicherweise geändert, da die neuen entvirtualisierten Inhalte den Wert von System.Windows.Controls.Primitives.IScrollInfo.ExtentWidth geändert haben.

Vor .NET Framework 4.6.2 verwendet der Scrollvorgang einfach den Kandidatenoffset, obwohl er möglicherweise nicht mehr „Hier“ oder „Rechter Rand“ entspricht. Dies führt zu Effekten wie einem „Springen“ des Leistenziehpunkts, die sich am besten durch ein Beispiel veranschaulichen lassen. Angenommen, ein System.Windows.Controls.DataGrid hat ExtentWidth=1000 und Width=200. Ein Scrollen zu „Rechter Rand“ verwendet den Kandidatenoffset 1000 - 200 = 800. Beim Scrollen zu diesem Offset werden neue Spalten entvirtualisiert. Nehmen Sie an, dass diese sehr breit sind, sodass sich System.Windows.Controls.Primitives.IScrollInfo.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 %.

Die Änderung besteht darin, einen neuen Kandidatenoffset neu zu berechnen, wenn diese Situation auftritt, und es erneut zu versuchen. So funktioniert das vertikale Scrollen bereits.

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 System.Windows.Controls.Primitives.IScrollInfo.HorizontalOffset nach einem horizontalen Scrollvorgang angewiesen ist, ob vom Endbenutzer oder durch einen expliziten Aufruf von SetHorizontalOffset(Double) aufgerufen.

Vorschlag

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

Name Wert
Umfang Geringfügig
Version 4.6.2
Typ Laufzeit

Betroffene APIs

Items.Clear entfernt keine Duplikate aus SelectedItems

Einzelheiten

Angenommen, ein Selektor (mit aktivierter Mehrfachauswahl) hat Duplikate in seiner System.Windows.Controls.Primitives.MultiSelector.SelectedItems Sammlung – dasselbe Element wird mehrmals angezeigt. Durch das Entfernen dieser Elemente aus der Datenquelle (z. B. indem Items.Clear aufgerufen wird) gelingt es nicht, sie aus System.Windows.Controls.Primitives.MultiSelector.SelectedItems zu entfernen; nur die erste Instanz wird entfernt. Darüber hinaus kann die nachfolgende Verwendung von System.Windows.Controls.Primitives.MultiSelector.SelectedItems (z. B. SelectedItems.Clear()) auf Probleme wie System.ArgumentException stoßen, da System.Windows.Controls.Primitives.MultiSelector.SelectedItems Elemente enthält, die nicht mehr in der Datenquelle vorhanden sind.

Vorschlag

Aktualisieren Sie nach Möglichkeit auf .NET Framework 4.6.2.

Name Wert
Umfang Geringfügig
Version 4.5
Typ Laufzeit

Betroffene APIs

Elementscrolling durch eine flache Liste mit Elementen mit unterschiedlicher Pixelhöhe

Einzelheiten

Wenn ein System.Windows.Controls.ItemsControl-Element eine Sammlung mithilfe von Virtualisierung (IsVirtualizing=true) und Elementscrolling (ScrollUnit=Item) anzeigt, und wenn das Steuerelement gescrollt wird, um ein Element anzuzeigen, dessen Größe in Pixeln sich von dessen Nachbarn unterscheidet, durchläuft System.Windows.Controls.VirtualizingStackPanel alle Elemente in der Sammlung. Die Benutzeroberfläche reagiert während dieser Iteration nicht. Die Iteration erfolgt unter anderen Umständen auch in früheren .NET Framework-Versionen. Sie tritt z.B. beim Scrollen von Pixeln (ScrollUnit=Pixel) auf, nachdem ein Element mit einer anderen Pixelhöhe erkannt wurde sowie beim Elementscrolling für hierarchische Daten (wie beim System.Windows.Controls.TreeView-Steuerelement oder einem System.Windows.Controls.ItemsControl-Element mit aktivierter Gruppierung), nachdem bei einem Element eine andere Anzahl von Nachfolgerelementen als bei seinen Nachbarn erkannt wurde. Im Fall des Elementscrollings bei unterschiedlicher Pixelhöhe wurde die Iteration in .NET Framework 4.6.1 eingeführt, um Fehler im Layout der hierarchischen Daten zu beheben. Es ist nicht erforderlich, wenn die Daten flach (keine Hierarchie) sind, und .NET Framework 4.6.2 tut dies in diesem Fall nicht.

Vorschlag

Wenn die Iteration in .NET Framework 4.6.1, aber nicht in früheren Releases auftritt, also wenn System.Windows.Controls.ItemsControl das Elementscrolling in einer flachen Liste von Elementen mit unterschiedlicher Pixelhöhe durchführt, gibt es zwei Lösungen:

  • Installieren Sie .NET Framework 4.6.2.
  • Installieren Sie Hotfix HR 1605 für .NET Framework 4.6.1.
Name Wert
Umfang Geringfügig
Version 4.6.1
Typ Laufzeit

Betroffene APIs

Der Hintergrund der RibbonGroup ist in lokalisierten Builds auf transparent festgelegt.

Einzelheiten

System.Windows.Controls.Ribbon.RibbonGroup Hintergrund auf lokalisierten Builds wurde immer mit transparentem Pinsel gezeichnet, was zu einer schlechten Ui-Erfahrung führt. Dies wurde im .NET Framework 4.7 WPF-Fix behoben, indem die lokalisierten Ressourcen für System.Windows.Controls.Ribbon.RibbonGroup aktualisiert werden, was wiederum sicherstellt, dass der richtige Pinsel ausgewählt wird.

Vorschlag

Upgrade auf .NET Framework 4.7

Name Wert
Umfang Rand
Version 4.6.2
Typ Laufzeit

Betroffene APIs

Kann nicht über API-Analyse erkannt werden.

Die Fehler bei der WPF-Rechtschreibprüfung treten auf unerwartete Art und Weise auf.

Einzelheiten

Dies umfasst eine Reihe von WPF-Rechtschreibprüfungsproblemen:

  • Die WPF-Rechtschreibprüfungs-API löst manchmal System.Runtime.InteropServices.COMException aus
  • Die WPF-Rechtschreibprüfung schlägt mit UnauthorizedAccessException fehl, wenn Anwendungen mithilfe von "Als anderer Benutzer ausführen" gestartet werden.
  • Die WPF-Rechtschreibprüfung identifiziert Rechtschreibfehler falsch in zusammengesetzten Wörtern wie "Hausnummer" in Deutsch.

Vorschlag

Problem Nr. 1 – Dies wurde in .NET Framework 4.6.2 Problem #2 behoben. Die WPF-Rechtschreibprüfung wird nicht mehr unterstützt, wenn Anwendungen mit "Als anderer Benutzer ausgeführt" gestartet werden. Ab .NET Framework 4.6.2 stürzt anwendungen, die auf diese Weise gestartet wurden, nicht mehr unerwartet ab. Stattdessen wird die Rechtschreibprüfung im Hintergrund deaktiviert. Problem #3 – Dies wurde in .NET Framework 4.6.2 behoben.

Name Wert
Umfang Rand
Version 4.6.1
Typ Laufzeit

Betroffene APIs

Kann nicht über API-Analyse erkannt werden.