3

現在、モダン UI アプリの ApplicationData の LocalSettings にチェックボックス (オン/オフ) の状態を保存しようとしています。私は過去 6 ~ 7 時間この問題に取り組み、さまざまなアプローチを試みましたが、今では自分のコードで完全に迷っていると思います。これまでの私のコード:

    void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        if (localSettings.Values.ContainsKey("isFirstChecked") == false || cbFirst.IsChecked == false)
        {
            cbFirst.IsChecked = false;
            test.Text = "UnChecked";
        }
        else 
        {
            cbFirst.IsChecked = true;
            test.Text = "Checked";
        }
    }

    private void cbFirst_Checked(object sender, RoutedEventArgs e)
    {
        test.Text = "Checked";
        localSettings.Values["isFirstChecked"] = cbFirst.IsChecked = true;
    }

    private void cbFirst_Unchecked(object sender, RoutedEventArgs e)
    {
        test.Text = "UnChecked";
        var test2 = localSettings.Values["isFirstChecked"] = cbFirst.IsChecked = false;

    }

すでに述べたように、この問題を解決するためにいくつかのアプローチを試みましたが、実際に両方の状態を保存できたものはなく、どちらか一方しか保存できませんでした (理由を知っている人もいると思います。現時点では失われています)。

何らかの理由で、チェックボックスがオフになっているにもかかわらず、「チェック済み」コードをデバッグすると起動します。

4

2 に答える 2

2

最初のコードの問題は、条件でさまざまなことをチェックしていることです。保存した設定が存在するかどうかを確認してから、チェックボックスがオンになっているかどうかを確認しています。現在行っていないのは、設定値が存在する場合の設定値の取得です。ロード時に次のことを試してください。

void MainPage_Loaded(object sender, RoutedEventArgs e)
{
    bool valueFromSettings = false;

    if (!localSettings.Values.ContainsKey("isFirstChecked"))
    {
        // if the setting doesn't exist, probably wise to create it here.
        // setting the default to "false", but you can change to true if that makes more sense.
        localSettings.Values.Add("isFirstChecked", false);
    }
    else
    {
        // read the value of the setting here.  
        // If we just created it, it should default to false (see above)
        valueFromSetting = ((bool)localSettings.Values["isFirstChecked"]);
    }

    if(valueFromSettings)
    {
        cbFirst.IsChecked = true;
        test.Text = "Checked";
    }
    else 
    {
        cbFirst.IsChecked = false;
        test.Text = "UnChecked";
    }
}

次に、以前に定義したハンドラーを使用できます (ただし、微妙な変更に注意してください。チェックボックスの値をチェックする必要はありませんが、設定を直接割り当てることができます)。

private void cbFirst_Checked(object sender, RoutedEventArgs e)
{
    test.Text = "Checked";
    localSettings.Values["isFirstChecked"] = true;
}

private void cbFirst_Unchecked(object sender, RoutedEventArgs e)
{
    test.Text = "UnChecked";
    localSettings.Values["isFirstChecked"] = false;
} 
于 2012-12-31T10:34:26.617 に答える
1
private void cbFirstCheckedChanged(object sender, EventArgs e)
{
    var checkBox = serder as CheckBox;
    if (checkBox == null) return;
    test.Text = checkBox.IsChecked ? "Checked" : "UnChecked";
    localSettings.Values["isFirstChecked"] = cbFirst.IsChecked
}

void MainPage_Loaded(object sender, RoutedEventArgs e)
{
    checkBox.IsChecked = localSettings.Values["isFirstChecked"];
}
于 2012-12-30T11:49:16.507 に答える