Должен ли я объявлять конвертеры в App.xaml или как файловый ресурс? - PullRequest
13 голосов
/ 02 ноября 2009

При объявлении конвертеров в приложении WPF я должен:

  1. Объявите всех моих конвертеров в App.xaml (т.е. в <Application.Resources/>), чтобы они были доступны всему приложению
  2. Объявите только необходимые преобразователи для каждого Page / Window / ResourceDictionary / UserControl и т. Д. В их Resources секции
  3. Что-то еще целиком

Что касается читабельности, метод 1 кажется мне лучшим, но мой вопрос касается производительности. Какой метод наиболее эффективен с точки зрения производительности, памяти и т. Д .?

Ответы [ 3 ]

43 голосов
/ 02 ноября 2009

Ну, я просто не объявляю их в 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 голосов
/ 02 ноября 2009

У меня есть ResourceDictionary, который объявляет несколько часто используемых конвертеров, таких как конвертер bool-to-visibility.Я ссылаюсь на этот словарь непосредственно в App.xaml.

Я объявляю другие преобразователи, которые более специфичны для данной ситуации на уровне страницы / окна (или в ResourceDictionary, на который ссылается страница / окно).

Я не могу ответить на вопрос о производительности однозначно, но я был бы очень удивлен, если бы это имело практическое значение во времени загрузки или использовании памяти.Объявление конвертера - это, по сути, создание объекта, поэтому он должен быть очень эффективным и использовать очень мало памяти, но я не проводил профилирование для сравнения производительности на уровне приложения и на уровне окна.

0 голосов
/ 02 ноября 2009

Если вам нужен только конвертер для одного окна, я бы поставил его для одного окна (или даже для элемента управления контейнера, который содержит элемент управления, который его использует).

Я бы сказал, что это более легко обслуживать - вы можете посмотреть объявление конвертера и узнать, что его использует. Вы знаете, что если вы измените элементы управления на этой конкретной странице, чтобы больше не использовать конвертер, вы можете извлечь его из ресурсов страницы, не затрагивая ничего другого. И наоборот, если конвертер является ресурсом приложения, выяснить, кто его использует, не так просто.

Если один и тот же конвертер используется более чем на одной странице, я бы все равно поместил бы его под каждый ресурс страницы. На самом деле, это только одна дополнительная строка в XAML.

Во всяком случае, это мое мнение, на сегодняшний день. Я ожидаю другой пост, утверждающий с точностью до наоборот. : -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...