12

私たちは現在、より大きな WPF LoB アプリケーションを計画しています。多くの UI 設定を格納するためのベスト プラクティスについて、他の人はどう考えているのでしょうか。

  • エキスパンダーの状態
  • メニュー注文
  • サイジング プロパティ
  • 等...

提供された SettingsProvider (つまり、App.config ファイル) を使用して多数の値を格納するという考えは好きではありませんが、カスタム SettingsProvider を使用して組み込みデータベースに値を格納するために使用できます。ある種のデータバインディングを使用できることも問題です。誰かが同じ問題を抱えていましたか?

多くの ui ユーザー設定を保存するために何をしましたか?

4

7 に答える 7

13

設定ファイルは次の場所に保存されます。

Environment.SpecialFolder.ApplicationData

xml の「設定」ファイルとして保存して、破損した場合にアクセスして変更するのがそれほど難しくないようにします。

これまでのところ、これはレジストリよりもはるかにうまく機能しています。何かが破損したり、リセットする必要がある場合は、クリーンで簡単に吹き飛ばすことができます.

于 2008-10-29T13:56:31.930 に答える
10

UI 設定を保存するより迅速な方法は、Properties.Settings.Default システムを使用することです。値への WPF バインディングを使用すると便利です。 例はこちら。設定は自動的に更新され、読み込まれます。

<Window ...
    xmlns:p="clr-namespace:UserSettings.Properties"
    Height="{Binding Source={x:Static p:Settings.Default}, Path=Height, Mode=TwoWay}" 
    Width="{Binding Source={x:Static p:Settings.Default}, Path=Width, Mode=TwoWay}" 
    Left="{Binding Source={x:Static p:Settings.Default}, Path=Left, Mode=TwoWay}" 
    Top="{Binding Source={x:Static p:Settings.Default}, Path=Top, Mode=TwoWay}">

...
protected override void OnClosing(System.ComponentModel.CancelEventArgs e) 
{ 
    Settings.Default.Save(); 
    base.OnClosing(e); 
}

それに関する問題は、アプリケーションが大きい場合、すぐに混乱することです。

別の解決策 (ここの誰かが提案) は、ApplicationData パスを使用して、独自の設定を XML に保存することです。そこで、独自の設定クラスを作成し、XML シリアライザーを使用してそれを永続化できます。このアプローチにより、バージョンからバージョンへの移行を行うことができます。この方法はより強力ですが、もう少しコードが必要です。

于 2008-10-29T18:19:12.133 に答える
4

aogan の回答を掘り下げ、それを decasteljau の回答と彼が参照したブログ投稿と組み合わせて、私には明確ではなかったいくつかのギャップを埋める例を次に示します。

xaml ファイル:

<Window ...
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:p="clr-namespace:MyApp"
    Height="{Binding Source={x:Static p:MyAppSettings.Default}, Path=MainWndHeight, Mode=TwoWay}"
    Width="{Binding Source={x:Static p:MyAppSettings.Default}, Path=MainWndWidth, Mode=TwoWay}"
    Left="{Binding Source={x:Static p:MyAppSettings.Default}, Path=MainWndLeft, Mode=TwoWay}"
    Top="{Binding Source={x:Static p:MyAppSettings.Default}, Path=MainWndTop, Mode=TwoWay}"
    ...

そしてソースファイル:

namespace MyApp
{
    class MainWindow ....
    {
        ...

        protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
        {
            MyAppSettings.Default.Save();
            base.OnClosing(e);
        }
    }

    public sealed class MyAppSettings : System.Configuration.ApplicationSettingsBase
    {
        private static MyAppSettings defaultInstance = ((MyAppSettings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new MyAppSettings())));
        public static MyAppSettings Default
        {
            get { return defaultInstance; }
        }

        [System.Configuration.UserScopedSettingAttribute()]
        [System.Configuration.DefaultSettingValueAttribute("540")]
        public int MainWndHeight
        {
            get { return (int)this["MainWndHeight"]; }
            set { this["MainWndHeight"] = value; }
        }

        [System.Configuration.UserScopedSettingAttribute()]
        [System.Configuration.DefaultSettingValueAttribute("790")]
        public int MainWndWidth
        {
            get { return (int)this["MainWndWidth"]; }
            set { this["MainWndWidth"] = value; }
        }

        [System.Configuration.UserScopedSettingAttribute()]
        [System.Configuration.DefaultSettingValueAttribute("300")]
        public int MainWndTop
        {
            get { return (int)this["MainWndTop"]; }
            set { this["MainWndTop"] = value; }
        }

        [System.Configuration.UserScopedSettingAttribute()]
        [System.Configuration.DefaultSettingValueAttribute("300")]
        public int MainWndLeft
        {
            get { return (int)this["MainWndLeft"]; }
            set { this["MainWndLeft"] = value; }
        }
    }
}
于 2010-02-09T06:41:53.317 に答える
2

すべてを に保存しますIsolation Storage(ClickOnce で実行しています)。シリアル化するオブジェクトがあります (XmlSerializer)。

于 2008-10-29T13:57:40.460 に答える
1

なんらかの理由で人気を失っているようです。しかし、レジストリは常にこの種の設定に適した場所です。

于 2008-10-29T13:52:08.910 に答える
1

カスタム SettingsProvider を使用して、構成情報をアプリのデータベース内のテーブルに保存します。これは、既にデータベースを使用している場合に適したソリューションです。

于 2008-10-29T13:58:49.523 に答える
1

Chris Sells & Ian Griffiths によるプログラミング WPF では、

WPF アプリケーションの優先設定メカニズムは、.NET および VS によって提供されるものです。つまり、組み込みデザイナーを使用した System.Configuration 名前空間の ApplicationSettingBase クラスです。

于 2008-10-29T17:26:07.123 に答える