2017-05-29 3 views
1

Ich entwickle eine WPFMVVM Anwendung zeigen einige Windows System Informations und üben einige MVVM.Windows-Version zeigt wahren Wert im Design, aber zeigt anderen Wert, wenn ich Programm

Irgendwie im Design Environment.OSVersion.ToString() funktioniert richtig, aber nach dem Debuggen tut es nicht. Ich habe versucht, Debug und Release-Modi, aber nichts ist geändert.

"Microsoft Windows NT 10.0.15063.0" wurde in Design-Zeit gezeigt:

"Microsoft Windows NT 6.2.9200.0" wurde gezeigt, wenn ich die Software ausführen:

Meine Usercontrol

<UserControl.DataContext> 
    <viewModels:WindowsVersionViewModel /> 
</UserControl.DataContext> 
<Grid> 
    <TextBox IsReadOnly="True" 
      HorizontalAlignment="Left" 
      VerticalAlignment="Top" 
      Text="{Binding Path=Version, Mode=OneWay}" /> 
</Grid> 

Meine Viewmodel

public class WindowsVersionViewModel : ObservableObject { 
    public string Version { get; } = Environment.OSVersion.ToString(); 
} 

Wie kann ich die korrekte Version nach dem Lauf bekommen und warum dies passiert?

+1

Dieser Aufruf wird nicht aus der Dokumentation empfohlen. "Ab Windows 8 gibt die OSVersion-Eigenschaft die gleichen Haupt- und Nebennummern für alle Windows-Plattformen zurück. Daher empfehlen wir nicht, den Wert dieser Eigenschaft abzurufen, um die Betriebssystemversion zu ermitteln." – Steve

Antwort

4

Dies passiert, weil Ihre Anwendung nicht für Windows 8.1 oder höher manifestiert ist.

Wenn eine nicht manifestierte Anwendung einen Aufruf an GetVersionEx() aufruft, gibt diese Funktion die Versionsnummer von Windows 8.0 zurück, wenn sie auf späteren Versionen des Betriebssystems ausgeführt wird.

Um dies zu beheben, müssen Sie Ihre Anwendung für die Versionen von Windows manifestieren, die Sie unterstützen möchten.

Um dies zu tun, müssen Sie add something to you application's app.manifest in the "compatibility" section.

Zum Beispiel:

<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> 
    <application> 
     <!-- A list of the Windows versions that this application has been tested on and is 
      is designed to work with. Uncomment the appropriate elements and Windows will 
      automatically selected the most compatible environment. --> 

     <!-- Windows Vista --> 
     <!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />--> 

     <!-- Windows 7 --> 
     <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" /> 

     <!-- Windows 8 --> 
     <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" /> 

     <!-- Windows 8.1 --> 
     <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" /> 

     <!-- Windows 10 --> 
     <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" /> 
    </application> 
</compatibility> 

Der Grund, warum dies im Designer funktioniert, weil Visual Studio für Windows manifestiert 10, und der Anruf die Versionsnummer zu erhalten, wird im Rahmen der Visual Studio gemacht.

+0

Das hat mein Problem dankend gelöst , aber das fühlt sich immer noch nicht richtig an: D – tetralobita

+0

Seien Sie versichert, es ist absolut richtig, @tetralobita. Visual Studio wird korrekt angezeigt, sodass die tatsächliche Betriebssystemversion zur Entwurfszeit gemeldet wird. Ihre App ist nicht korrekt manifestiert, also liegt das Betriebssystem an Ihnen, was die aktuelle Version zur Laufzeit ist. –

+1

Übrigens kann es nützlich sein zu erwähnen, dass dieses Verhalten aus Gründen der Rückwärtskompatibilität gewählt wurde und dass es in einer gut konzipierten Anwendung kein Problem darstellt. Sie sollten keine Versionsnummern überprüfen; Sie sollten stattdessen die Unterstützung für bestimmte Funktionen überprüfen. –

Verwandte Themen