16

WPF アプリケーションでコンバーターを宣言するときは、次のことを行う必要があります。

  1. すべてのコンバーターを App.xaml (つまり) で宣言し<Application.Resources/>て、アプリケーション全体で使用できるようにします。
  2. セクション内の各Page/ Window/ ResourceDictionary/UserControlなどに必要なコンバーターのみを宣言しますResources
  3. まったく別のもの

読みやすさに関しては、方法 1 が最善のように思えますが、私の質問はパフォーマンスに関するものです。パフォーマンス、メモリなどの点で最もリソース効率が高いのはどの方法ですか?

4

3 に答える 3

51

まあ、私はそれらをxamlでまったく宣言していません。代わりに、 から私のコンバーターを追加で派生させ MarkupExtensionます。このような:

public class MyValueConverter : MarkupExtension, IValueConverter
{
    private static MyValueConverter _converter = null;
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        if (_converter == null) _converter = new MyValueConverter();    
        return _converter;
    }

    public object Convert
     (object value, Type targetType, object parameter, CultureInfo culture) { }
    public object ConvertBack
     (object value, Type targetType, object parameter, CultureInfo culture) { }
}

これにより、次のようにコンバーターをどこでも使用できます。

Source="{Binding myValue, Converter={converters:MyValueConverter}}"

ここで、converters は、コンバーターを宣言した名前空間です。

このトリックは、古いスタック オーバーフロー スレッドからのみ学びました。

于 2009-11-02T09:54:40.017 に答える
2

bool-to-visibility コンバーターなど、いくつかの一般的に必要なコンバーターを宣言する ResourceDictionary があります。この辞書は、App.xaml で直接参照します。

ページ/ウィンドウ レベル (またはページ/ウィンドウによって参照される ResourceDictionary) で特定の状況に固有の他のコンバーターを宣言します。

パフォーマンスの質問に明確に答えることはできませんが、読み込み時間やメモリ使用量に実質的な違いが生じた場合は非常に驚くでしょう. コンバーターの宣言は基本的にオブジェクトのインスタンス化であるため、非常に効率的でメモリの使用量が非常に少ないはずですが、アプリ レベルとウィンドウ レベルのパフォーマンスを比較するプロファイリングは行っていません。

于 2009-11-02T06:10:29.623 に答える
0

1つのウィンドウ用のコンバーターのみが必要な場合は、1つのウィンドウ用に(または、それを使用するコントロールを保持するコンテナーコントロールのみ用に)配置します。

これはより保守しやすいと思います。コンバーター宣言を見て、何がそれを使用しているかを知ることができます。その特定のページのコントロールを変更してコンバーターを使用しなくなった場合、他に影響を与えることなく、ページのリソースからコンバーターを削除できることをご存知でしょう。逆に、コンバーターがアプリケーションリソースである場合、コンバーターを使用しているものがあるかどうかを確認するのはそれほど簡単ではありません。

同じコンバーターが複数のページで使用されている場合でも、各ページリソースの下に配置します。実際、XAMLでは1行余分に追加されています。

とにかく、それは今日の私の意見です。私は正反対を主張する別の投稿を期待しています。:-)

于 2009-11-02T04:53:43.363 に答える