2016-08-22 5 views
1

ユーザー設定の編集や奇妙な問題へのアプリケーションの作成を試みています。私はuser settingsを使って書いて、読んでいて、変数の1つを読むことができません。 Visual Studioの設定エディタでユーザー設定で間違ったdouble型の値が読み取られる

public MainWindow() 
    { 
     InitializeComponent(); 

     input1.Value = Properties.Settings.Default.input1Setting; 
     input2.Value = Properties.Settings.Default.input2Setting; 
    } 


    private void input1_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) 
    { 
     Properties.Settings.Default.input1Setting = Convert.ToDouble(input1.Value); 
     Properties.Settings.Default.Save(); 
    } 

    private void input2_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) 
    { 
     Properties.Settings.Default.input2Setting = Convert.ToInt16(input2.Value); 
     Properties.Settings.Default.Save(); 
    } 

    private void OnlyNumberValidation(object sender, TextCompositionEventArgs e) 
    { 
     Regex regex = new Regex("[^0-9]+"); 
     e.Handled = regex.IsMatch(e.Text); 
    } 

とXAMLスライダー

<Slider ValueChanged="input1_ValueChanged" IsSnapToTickEnabled="True" TickFrequency="0.25" Minimum="1" Maximum="50" Name="input1" PreviewTextInput="OnlyNumberValidation"/> 
<Slider ValueChanged="input2_ValueChanged" IsSnapToTickEnabled="True" TickFrequency="1" Maximum="2000" Minimum="0" Name="input2" PreviewTextInput="OnlyNumberValidation"/> 

intとして、二重、INPUT2として設定INPUT1。ボットスコープはユーザーに設定されます。

問題は、スライダーinput2だけが正しい値を取得することです。 input1は常に1に設定されます。

起動時にMessageBox.Show(Properties.Settings.Default.input1Setting.ToString())を追加しようとしましたが、それでもapp.configのinput1の値は1でしたが(project/bin /デバッグ/フォルダ、ローカル/会社/プロジェクト/ 1.0.0 /とVisual Studio app.configのいずれか)4)

upd1 4から4.0への変更は役に立ちませんでした。まだ1に変更されます。

+0

設定ファイルでinput1を '4.0 'に設定してみてください。 – arbitrarystringofletters

+0

@arbitrarystringofletters助けてくれなかった – Wurunduk

+0

フォームの初期化によって問題が発生している可能性があります。あなたは 'MessageBox'を表示するのではなく、コンソールの設定値を書くことができますか? 'Console.Read();' – arbitrarystringofletters

答えて

0

input1の最小値がゼロでない場合、ValueChangedがXAMLに設定されます。スライダが作成されると、デフォルトでは値が0になり、イベントが配線されて最小値と最大値の範囲内に調整されます。

これは、input1で値が1に変更され、イベントが発生して値を設定に保存することを意味します。これはすべてInitializeComponent中に発生するため、MainWindowのコンストラクタでinput1.Valueを割り当てる前に発生します。

オプション1

は、まず既存のコードにはあまり変化している、いくつかのオプションがあります。 ValueChangedバインディングをXAMLから削除します。

<Slider IsSnapToTickEnabled="True" TickFrequency="0.25" Minimum="1" Maximum="50" Name="input1" PreviewTextInput="OnlyNumberValidation"/> 
<Slider IsSnapToTickEnabled="True" TickFrequency="1" Maximum="2000" Minimum="0" Name="input2" PreviewTextInput="OnlyNumberValidation"/> 

そして、あなたが値を設定した後、既存の値を再保存しないようにそれらを追加しても良く、InitializeComponentの後にそれらを追加します。

input1.ValueChanged += input1_ValueChanged; 
    input2.ValueChanged += input2_ValueChanged; 

オプション2

しかし、どのような物事を見る方法によっては、コントロールを直接設定にバインドし、フォームの終了時にのみsaveを呼び出すことが、より良いオプションかもしれません。

設定キーがapp.xamlファイルに配置されていることを確認してください。 xmlns:properties = "clr-namespace:WpfApplication1.Properties" Application.Resoursesノード内にプロパティノードを追加するには、アプリケーションノード属性に名前空間を追加する必要があります。以下は、(一般的な名前空間で)あなたのapp.xamlがどのように見えるかの例です:

<Application x:Class="WpfApplication1.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:local="clr-namespace:WpfApplication1" 
      xmlns:properties="clr-namespace:WpfApplication1.Properties" 
      StartupUri="MainWindow.xaml"> 
    <Application.Resources> 
    <properties:Settings x:Key="Settings" /> 
    </Application.Resources> 
</Application> 

今すぐ戻ってあなたMainWindow.xamlで、(上記の例のように)にValueChangedを削除し、結合Valueプロパティを追加設定値:

<Slider IsSnapToTickEnabled="True" TickFrequency="0.25" Minimum="1" Maximum="50" Name="input1" Value="{Binding Source={StaticResource Settings}, Path=Default.input1Setting}" PreviewTextInput="OnlyNumberValidation"/> 
<Slider IsSnapToTickEnabled="True" TickFrequency="1" Maximum="2000" Minimum="0" Name="input2" Value="{Binding Source={StaticResource Settings}, Path=Default.input2Setting}" PreviewTextInput="OnlyNumberValidation"/> 

そして、あなたのMainWindow.xaml。CSはこのようにそれを修正しますファイル:もちろん

public MainWindow() 
{ 
    InitializeComponent(); 
    Closing += MainWindow_Closing; 
} 

private void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e) 
{ 
    Properties.Settings.Default.Save(); 
} 

private void OnlyNumberValidation(object sender, TextCompositionEventArgs e) 
{ 
    Regex regex = new Regex("[^0-9]+"); 
    e.Handled = regex.IsMatch(e.Text); 
} 

をあなたの代わりにXAMLであなたのイベントを配線することを好む場合は、閉会+ = MainWindow_Closingをスキップすることができます。 MainWindow.xaml.csファイルで、MainWindow.xamlのWindowノードに属性Closing = "MainWindow_Closing"を追加してください。

私はオプションの2が好きです。なぜなら、Settings.Defaultの値は常にスライダーの値に基づいて使用できますが、次の起動時に使用できるように保存するだけです。

これらを試して、どちらが良いかを確認してください。

関連する問題