在WPF应用程序中声明转换器时,我应该:
<Application.Resources/>
中),以便整个应用程序可以使用Page
部分Window
/ ResourceDictionary
/ UserControl
/ Resources
等声明仅需要的转换器
关于可读性,方法1对我来说似乎是最好的,但我的问题是关于性能。哪种方法在性能,内存等方面资源效率最高?
答案 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中的一个额外行。
无论如何,这是我的观点,截至今天。我期待另一篇文章恰恰相反。 : - )