我应该在App.xaml中声明转换器还是作为每个文件资源?

时间:2009-11-02 03:17:54

标签: wpf performance ivalueconverter

在WPF应用程序中声明转换器时,我应该:

  1. 在App.xaml中声明所有我的转换器(即在<Application.Resources/>中),以便整个应用程序可以使用
  2. Page部分
  3. 中为每个Window / ResourceDictionary / UserControl / Resources等声明仅需要的转换器
  4. 其他完全
  5. 关于可读性,方法1对我来说似乎是最好的,但我的问题是关于性能。哪种方法在性能,内存等方面资源效率最高?

3 个答案:

答案 0 :(得分:43)

好吧,我根本就没有在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}}"

其中converter是我声明我的转换器的命名空间。

仅从旧的stackoverflow线程中学到了这个技巧。

答案 1 :(得分:2)

我有一个ResourceDictionary,它声明了几个常用的转换器,例如bool-to-visibility转换器。我直接在App.xaml中引用这个词典。

我在页面/窗口级别(或在页面/窗口引用的ResourceDictionary中)声明其他特定于给定情境的转换器。

我无法肯定地回答性能问题,但如果它在加载时间或内存使用方面产生实际差异,我会感到非常惊讶。声明转换器基本上是一个对象实例化,所以它应该非常高效并且使用非常少的内存,但我没有进行任何分析来比较应用程序级别与窗口级别的性能。

答案 2 :(得分:0)

如果您只需要一个窗口的转换器,我会将它放在一个窗口中(或者甚至只用于容纳使用它的控件的容器控件)。

我认为这更易于维护 - 您可以查看转换器声明并告诉它使用它的原因。您知道,如果您将该特定页面上的控件更改为不再使用转换器,则可以将其从页面的资源中删除而不会影响其他任何内容。相反,如果转换器是一个应用程序资源,那么确定使用它的内容并不是那么简单。

如果同一个转换器被多个页面使用,我仍然会将它放在每个页面资源下面。实际上,它只是XAML中的一个额外行。

无论如何,这是我的观点,截至今天。我期待另一篇文章恰恰相反。 : - )