在WPF应用程序声明当转换器,我应该:我应该在App.xaml中声明转换器还是作为每个文件资源?
- 声明所有我的转换器中的App.xaml(即
<Application.Resources/>
),所以它可用于整个应用程序 - 声明只需要转换器每个
Page
/Window
/ResourceDictionary
/UserControl
等在他们的Resources
部分 - 别的东西完全
关于可读性,方法1似乎对我最好,但我的问题是关于性能。哪种方法在性能,内存等方面资源效率最高?
在WPF应用程序声明当转换器,我应该:我应该在App.xaml中声明转换器还是作为每个文件资源?
<Application.Resources/>
),所以它可用于整个应用程序Page
/Window
/ResourceDictionary
/UserControl
等在他们的Resources
部分关于可读性,方法1似乎对我最好,但我的问题是关于性能。哪种方法在性能,内存等方面资源效率最高?
嗯,我只是不会在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线程学习这个技巧。
如果你只需要一个窗口的转换器,我会把它放在一个窗口中(或者甚至只是容纳使用它的控件的容器控件)。
我会争辩说,这是更可维护的 - 你可以看看转换器的声明,并能够告诉什么使用它。您知道,如果您更改特定页面上的控件以不再使用转换器,则可以将其从页面资源中取出,而不会影响其他任何内容。相反,如果转换器是应用程序资源,那么确定使用它的内容并不那么简单,如果有的话。
如果同一个转换器被多个页面使用,我会把仍然是放在每个页面资源下。真的,这只是XAML中的一个额外的行。
无论如何,这是我的观点,截至今日。我期待另一篇文章辩论完全相反。 :-)
没有这样的运气。我的回答是一半相反,一半相同:-P – devuxer 2009-11-02 06:13:56
我有一个ResourceDictionary声明了几个常用转换器,比如一个bool-to-visibility转换器。我直接在App.xaml中引用此字典。
我声明了其他转换器,这些转换器对页/窗口级别(或由页面/窗口引用的ResourceDictionary)中的特定情况更加具体。
我无法明确地回答性能问题,但是如果它在加载时间或内存使用方面产生实际差异,我会非常惊讶。声明一个转换器基本上是一个对象实例化,所以它应该非常高效并且使用很少的内存,但是我没有做任何分析来比较应用程序级别和窗口级别的性能。
那么这是我的问题... 如果你会知道性能答案,请不要忘记回来。 – Shimmy 2009-11-02 12:11:16
我刚学到东西,肯定会有用的! – Shimmy 2009-11-03 02:44:56
是的,这在性能方面更好,因为每次使用转换器时都不会实例化新对象。它只在第一次调用MarkupExtension返回之前创建一个实例,并且每次都返回相同的实例。 – Yogesh 2009-11-03 03:32:07
谢谢!这使生活更轻松。 – si618 2010-09-25 03:50:20