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

Shi*_*mmy 15 wpf performance ivalueconverter

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

  1. 在App.xaml(即in )中声明我的所有转换器,<Application.Resources/>以便它可供整个应用程序使用
  2. 在其部分中仅声明每个Page/ Window/ ResourceDictionary/ UserControl等所需的转换器Resources
  3. 还有别的东西

关于可读性,方法1对我来说似乎是最好的,但我的问题是关于性能.哪种方法在性能,内存等方面最具资源效率?

Yog*_*esh 47

好吧,我根本就没有在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) { }
}
Run Code Online (Sandbox Code Playgroud)

这允许我在任何地方使用我的转换器,如下所示:

Source="{Binding myValue, Converter={converters:MyValueConverter}}"
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我刚刚学到了一些东西,肯定会有用! (2认同)
  • 是的,这在性能方面更好,因为它不会在每次使用转换器时实例化新对象.它只在第一次调用MarkupExtension之前创建一个实例,并且每次都返回相同的实例. (2认同)