0

ユーザー設定がある場合ToggleThis

ここに画像の説明を入力してください

この設定をユーザーがメニューで利用できるようにしたいのですが、たとえば、Settings/ToggleSettingsと言います。それをクリックします。クリックするたびに、ユーザー設定のtrue / falseを切り替えるだけでなく、menuItemアイコンを更新して実際の設定を表示する必要があります。

私はこれを使用して行うことができます

XAML

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">

    <Grid>
        <Menu IsMainMenu="True">
            <MenuItem Header="_Settings">
                <MenuItem Header="_Toggle" Name="ToggleSettings" Click="MenuItem_Click">
                    <MenuItem.Icon>
                        <Image Source="Images/Toggle.png" />
                    </MenuItem.Icon>
                </MenuItem>
            </MenuItem>            
        </Menu>
    </Grid>
</Window>

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void MenuItem_Click(object sender, RoutedEventArgs e)
        {
            if (ToggleSettings.Icon == null)
            {
                Uri Icon = new Uri("pack://application:,,,/Images/" + "Toggle.png");
                ToggleSettings.Icon = new Image
                {
                    Source = new BitmapImage(Icon)
                };
                Properties.Settings.Default.toggleThis = true;
            }
            else
            {
                ToggleSettings.Icon = null;
                Properties.Settings.Default.toggleThis = false;
            }
        }


    }
}

ただし、これは正しい方法ではないことを私は知っています。たとえば、起動時にメニューが以前の設定に基づいて正しい状態にならない可能性があります。問題は、正しい方法がわからないことです。誰かが私にこれを行う正しい方法についてのいくつかの指針を与えることができますか?

MenuItemのアイコンや値の両方でバインディングを使用する必要があると思いますが、どこから始めればよいのかよくわかりません。

ありがとうございました

4

2 に答える 2

1

Save適切と思われる場合は、電話する必要があります。

Properties.Settings.Default.Save();

使用方法が完全に明確ではありませんが、これにより、更新された値が少なくとも保存されるようになります。

于 2012-09-16T20:36:32.333 に答える
1

実際には、「正しい」方法はありません。最も効果的な方法と、状況に応じて最も適切な方法のみがあります。

あなたの例はうまく見えますが、少なくともこれまでのところ、あなたが抱えている唯一の問題は、ユーザーが最後にソフトウェアを使用したときに、ユーザーが選択した/選択しなかったものと同期して選択されたオプションがないことです。

これには、コードの2つの小さな部分だけが2つの特定の場所にある必要があります。

  • オースティンはすでにそれらの1つを指摘しました:設定を保存します。これは、メソッドのif/elseの直後に実行する必要がありますMenuItem_Click。eを呼び出す前に、メソッドがなんらかの形で終了しないことを確認してくださいSettings.Sav... a try/catchは、一貫した設定状態を確保するための適切な方法であることが賢明です。
  • もう1つは、あなた自身が言及した「時間」です。アプリの初期化または起動です。アプリのどこかで、初期ロードが完了する前に、作成した設定にアクセスし(toggleThis)、それを使用してメニュー項目の初期状態を設定する必要があります。

これを容易にする最善の方法は、メニュー項目に表示されているアイコンを変更することと、アプリの設定に最新の状態を保存することの両方を行うプライベートメソッドを用意することです。メソッドToggle()内で呼び出す、おそらく呼び出されるMenuItem_Clickメソッド。ただし、問題のメニュー項目とIDを指定する必要があります。これは、コードビハインドのメニュー項目にアクセスするために使用できます。また、このコード例では、アイコンが設定に保存されていることを前提としていますが、アイコンは、参照できる限り、どこからでも取得できます。

したがって、コードは次のようになりますが、正確には次のようにはなりません。

public MainWindow() 
    { 
        InitializeComponent();
        this.SetToggleIcon(Properties.Settings.Default.toggleThis);
    } 

    private void Toggle()
    {
        this.StoreToggleState(!Properties.Settings.Default.toggleThis);
        this.SetToggleIcon(Properties.Settings.Default.toggleThis);
    }

    private void SetToggleIcon(bool state)
    {
      this.menuItem_ToggleSettings.Icon = (Properties.Settings.Default.toggleThis) ? Properties.Settings.Default.IconTrue : Properties.Settings.Default.IconFalse;
    }

    private void StoreToggleState(bool state)
    {
       Properties.Settings.Default.toggleThis = state;
       Properties.Settings.Default.Save();
    }

    private void MenuItem_Click(object sender, RoutedEventArgs e) 
    { 
      this.Toggle();
    }
于 2012-09-16T21:26:01.003 に答える