2016-07-11 3 views
1

Ich möchte einige Eigenschaften meines Window in Xml bei Beendigung gespeichert und neu geladen und beim Start angewendet werden.Kann Standort und WindowSize nicht von Config übernehmen

Ich spare die Werte zu XML, die bis jetzt gut funktioniert. Ich aktualisiere die Werte in meinem ViewModel in der zugehörigen ChangedEvents.

[Serializable] 
public class UserSettings 
{ 
    public double WindowWidth { get; set; } 

    public double WindowHeight { get; set; } 

    //GridSplitter 
    public double GridLength_Pixels { get; set; } 

    public double WindowPositionX { get; set; } 
    public double WindowPositionY { get; set; } 
} 

Das ist mein XAML:

<Window x:Class="MonitorTool.Windows.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:MonitorTool" 
    xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"   
    Title="Transport Monitor" 
    MinWidth="300" 
    MinHeight="550" 
    Height="{Binding WindowHeight, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
    Width="{Binding WindowWidth, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"   
    Topmost="{Binding ElementName=TopMostCheckBox, Path=IsChecked}" 
    Icon="{Binding Path=Icon, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
    Left="{Binding Path=LocationX, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
    Top="{Binding Path=LocationY, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"> 
[...] 

Die propertiesin meine Ansichtsmodell sind alle ziemlich gleich, so werde ich hier eine Pose nur, aber es sollte klar sein:

public double WindowWidth 
    { 
     get { return _windowWidth; } 
     set 
     { 
      _windowWidth = value; 
      OnPropertyChanged("WindowWidth"); 
     } 
    } 

So Ich habe eine Methode namens ApplyUserSettings erstellt, die in MainWindow_ContentRendered aufgerufen wird, wo ich meine Config laden und die Eigenschaften mit diesen Werten füllen.

Aber nichts passiert und ich wusste nicht, wo ich nach einer Lösung suchen sollte. Ich habe viele Beispiele online gefunden, wo ppl auf defaultSettings gespeichert wird, aber das scheint kein großer Unterschied zu sein - so sollte es auch mit meiner eigenen Einstellungsdatei funktionieren.

Wer eine Idee, was hier falsch sein könnte?

EDIT:

Es scheint, wie die Fenster Start-ups mit MinWidth und MinHeight.

EDIT V2: Das Ansichtsmodell:

In MainWindow.xaml.cs:

public MainWindow() 
    { 
     InitializeComponent(); 
     if(MainWindowViewmodel.Instance == null) 
     { 
      MainWindowViewmodel.Instance = new MainWindowViewmodel(this); 
     }    
     DataContext = MainWindowViewmodel.Instance; 
     InitializeTray(); 
     TrayIcon.Visible = true; 
    } 

Wie Sie richtig sehen können, wird der Wert eingestellt, aber es scheint, wie sein nicht angewandt; ( enter image description here

+0

Bei eingestellt werden welchem ​​Punkt Sie Ihre Ansichtsmodell erstellen? Schaffst du es nur im XAML? I.e. ist eine neue Ansicht Modell erstellt jedes Mal, wenn Ihr Fenster über die XAML startet? –

+0

@GingerNinja nein Ich habe eine Instanz Ich habe auch einen Splashscreen, der das gleiche vm verwendet, aber dort verwende ich die gleiche Instanz davon –

+0

Es gibt ein Dutzend Fragen in StackOverflow mit dem gleichen Kontext und vielen Gründen warum verbindliche Eigenschaften wie Breite funktioniert nicht. Sie schlagen auch viele Workarounds vor. Hast du eines davon gesehen/probiert? Wenn das so was nicht funktioniert? – Athafoud

Antwort

1

Ich mache einen sehr einfachen Test mit dem folgenden Ansichtsmodell:

public class UserSettingsVM: INotifyPropertyChanged 
{ 
    private double _windowWidth; 
    public double WindowWidth 
    { 
     get { return _windowWidth; } 
     set 
     { 
      _windowWidth = value; 
      OnPropertyChanged("WindowWidth"); 
     } 
    } 
    ... 

}

Und hier ist ein Code eines Fensters:

public partial class MainWindow : Window 
{ 
    private UserSettingsVM _vm = new UserSettingsVM(); 

    public MainWindow() 
    { 
     InitializeComponent(); 

     DataContext = _vm; 
    } 

    private void Window_ContentRendered(object sender, EventArgs e) 
    { 
     _vm.WindowWidth = 1000; 
    } 
} 

Es funktioniert wie ein Charme. So scheint es mir, dass Sie ein kleines Detail verpasst haben. Hier sind einige Tipps:

  1. Versuchen Sie, einen vereinfachten Code ähnlich meinem zu verwenden. Wenn es für mich funktioniert, sollte es für Sie arbeiten.
  2. Bestätigen Sie, dass Sie in ApplyUserSettings die gleiche Instanz eines Ansichtsmodells wie in einem Fenster ändern.
  3. Vielleicht ist eine Ausnahme geworfen und fangen unter der Haube, was bewirkt, dass die Bindung nicht funktioniert. Um dieses Szenario zu überprüfen, sagen Sie VS, dass es bricht, wenn eine Ausnahme ausgelöst wird.Drücken Sie dazu Strg + Alt + E und aktivieren Sie ein Kontrollkästchen neben Common Language Runtime Ausnahmen.
  4. Gehen Sie zu Werkzeuge-> Optionen. Wählen Sie Debugging-> Ausgabefenster. Unter Kategorie WPF Trace-Einstellungen Datenbindung auf Warnung. Führen Sie nun Ihre Anwendung im Debug-Modus aus und öffnen Sie Ausgabe Fenster. Wenn verbindliche Probleme auftreten, werden entsprechende Meldungen angezeigt.

EDIT:

Was MinWidth, wenn es auf X gesetzt ist, dann Width kann nicht auf einen Wert kleiner als X.

+0

Ich habe eine Probe funktioniert ... Jedenfalls kann ich meine alte App nicht dazu bringen, das für mich zu tun ... Ich habe Ihre Punkte von 2 -> 4, ich Ich habe nur 1 Instanz meiner VM, keine speziellen Ausnahmen werden geworfen und es gibt keine verbindlichen Fehler ... Da ich die MinHeight se kann die Verwendung kann nicht speichern einen Wert kleiner als das und das ist, was aus der Konfig geladen ist - nicht a Problem dann ... –

Verwandte Themen