2009-11-02 28 views
10

在WPF应用程序声明当转换器,我应该:我应该在App.xaml中声明转换器还是作为每个文件资源?

  1. 声明所有我的转换器中的App.xaml(即<Application.Resources/>),所以它可用于整个应用程序
  2. 声明只需要转换器每个Page/Window/ResourceDictionary/UserControl等在他们的Resources部分
  3. 别的东西完全

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

回答

37

嗯,我只是不会在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}}" 

,其中转换器是在我宣布我的转换器的命名空间。

只从旧的stackoverflow线程学习这个技巧。

+2

我刚学到东西,肯定会有用的! – Shimmy 2009-11-03 02:44:56

+2

是的,这在性能方面更好,因为每次使用转换器时都不会实例化新对象。它只在第一次调用MarkupExtension返回之前创建一个实例,并且每次都返回相同的实例。 – Yogesh 2009-11-03 03:32:07

+0

谢谢!这使生活更轻松。 – si618 2010-09-25 03:50:20

0

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

我会争辩说,这是更可维护的 - 你可以看看转换器的声明,并能够告诉什么使用它。您知道,如果您更改特定页面上的控件以不再使用转换器,则可以将其从页面资源中取出,而不会影响其他任何内容。相反,如果转换器是应用程序资源,那么确定使用它的内容并不那么简单,如果有的话。

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

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

+0

没有这样的运气。我的回答是一半相反,一半相同:-P – devuxer 2009-11-02 06:13:56

2

我有一个ResourceDictionary声明了几个常用转换器,比如一个bool-to-visibility转换器。我直接在App.xaml中引用此字典。

我声明了其他转换器,这些转换器对页/窗口级别(或由页面/窗口引用的ResourceDictionary)中的特定情况更加具体。

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

+0

那么这是我的问题... 如果你会知道性能答案,请不要忘记回来。 – Shimmy 2009-11-02 12:11:16

相关问题