2016-01-07 3 views
1

В настоящее время я использую статический конструктор для каждого окна/UserControl для выполнения некоторой инициализации, которая является же для всех из них (инициализации статического свойства некоторых внешнего класса библиотеки, необходимую для расширения разметки расположенный в этой библиотеке для работы).Применения в масштабе инициализация дизайнера

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

Во время выполнения вся инициализация происходит в конструкторе App. И это странно клонирует десятки статических конструкторов только для дизайнера, потому что дизайнеру, похоже, все равно App.

Я бы сделал базовый класс с таким статическим конструктором для всех Windows/UserControls, к сожалению, C# не поддерживает многоуровневое.

+0

Досадно статические конструкторы [не надежны] (http://stackoverflow.com/q/ 34672949/1997232). – Sinatr

ответ

0

Не можете ли вы использовать одиночный шаблон вместо статического конструктора?

например. в ViewModel: var yourComponent = YourComponent.Current;

public class YourComponent 
{ 
    private static YourComponent _current; 
    public static YourComponent Current { 
    get { 
     return _current ?? (_current = new YourComponent()); 
    } 
    } 

    private YourComponent() 
    { 
     //perform your initialization here. This will be executed only once; 
    } 
} 

EDIT: Чтобы ответить на ваш вопрос, есть ли глобальная инициализация место для МОФ (XAML) дизайнер: да, это - App.xaml

Хотя XAML дизайнер делает не запускать события приложения в codebehind, он загружает ресурсы, и вы можете легко intantiace любого класса в ресурсах. Просто выполнить вашу логику инициализации в constuctor класса и добавить класс приложения ресурсов

+0

Это привело меня к идее иметь базовый класс для 'Windows' и еще один для' UserControl', то есть всего 2 статических конструктора. Не совсем уверен, почему синглтон. Все еще вопрос открыт, мне бы очень хотелось узнать, существует ли такое глобальное место инициализации для wpf (xaml). – Sinatr

+0

избегать использования статического конструктора. Если в статическом конструкторе возникла ошибка (и всегда может быть какое-то неожиданное исключение), то в непредсказуемых местах она не сработает, потому что вы никогда не знаете, когда будет вызван статический конструктор затрат – Liero