2016-07-11 9 views
1

Windowのいくつかのプロパティをxmlに保存して終了し、再起動して起動時に適用したいです。ConfigからLocationとWindowSizeを適用できません

XMLに値を保存していますが、これまでのところうまくいきました。 私のViewModelの値を関連する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; } 
} 

この

は私 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}"> 
[...] 

propertiesin私のViewModelにあるすべて全く同じだから、僕はここに1をもたらすだろうが、それは明らかである:だから

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

私はApplyUserSettingsというメソッドを作成しました。これはMainWindow_ContentRenderedで呼び出され、ここでConfigをロードし、これらの値をプロパティに入力します。

しかし、何も起こっていないし、どこで解決策を探すべきか分からない。 私は、pplがdefaultSettingsに格納されているが、それは大きな違いのようには見えないので、多くの例題をオンラインで見つけました。それで、自分の設定ファイルでも同じように動作するはずです。

ここで何が間違っているのでしょうか?

EDIT:

それはMinWidthMinHeightとウィンドウのスタートアップのように思えます。

EDITのV2:ViewModelに:

MainWindow.xaml.csで:

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

あなたは値が正しく設定されて見ることができますが、それは適用されませんそのように思えるとして;( enter image description here

+0

より小さい値に設定することができませんか? XAMLで作成していますか?私。あなたのウィンドウがxamlで起動するたびに新しいモデルが作成されますか? –

+0

@GingerNinjaいいえ私はインスタンスを持っています私は同じVMを使用するスプラッシュスクリーンを持っていますが、そこでは同じインスタンスを使用します –

+0

StackOverflowには同じコンテキストと多くの理由で何十もの質問があります。幅が機能していません。彼らはまた、多くの回避策を提案しています。あなたは見たことがありますかこれらのいずれかを試しましたか?もしこれがうまくいかないのであれば? – Athafoud

答えて

1

私は以下のビューモデルで非常に簡単なテストを行います:

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

}

そして、ここではウィンドウのコードです:

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; 
    } 
} 

それは魔法のように動作します。だから、あなたは細かいことを忘れてしまったように思えます。いくつかのヒントがあります:

  1. 私のような簡略化されたコードを使用してください。それが私のために働くなら、それはあなたのために働くはずです。
  2. ApplyUserSettingsで、ウィンドウで使用されているのと同じビューモデルのインスタンスを変更していることを確認します。
  3. 例外がスローされ、そのバインディングが機能しない原因となっているものがあります。このシナリオを検証するには、VSに例外がスローされたときに中断するように指示します。これを行うには、Ctrl + Alt + Eを押して、共通言語ランタイム例外の横のチェックボックスをオンにします。
  4. ツール - >オプションにアクセスしてください。 デバッグ - >出力ウィンドウを選択します。カテゴリWPFトレース設定のデータバインドをに設定してください。警告。アプリケーションをデバッグモードで実行し、出力ウィンドウを開きます。バインディングに問題がある場合は、適切なメッセージが表示されます。

EDIT:それはXに設定されている場合MinWidthについては

、その後WidthはあなたのViewModelを作成するのですかどのような点でX.

+0

私はサンプルを稼働している...とにかく私は私のためにそれを行う私の古いアプリを得ることができない...私は2から4まであなたのポイントを渡した唯一の私のVMのインスタンスを持って、特別な例外がスローされ、バインディングエラーはありません...私はMinHeightを使用しているので、問題は... –

関連する問題