Получение диспетчера пользовательского интерфейса в библиотеке классов - PullRequest
14 голосов
/ 31 мая 2011

Я хотел бы спроектировать библиотеку классов и планировать использовать многопоточность (т.е. BackgroundWorker). Мне придется следить за контекстом потока, из которого производятся обновления для полей, если я планирую привязать их к графическому интерфейсу библиотеки, потребляющей интерфейс. Не очень хорошая идея передавать ссылку диспетчера графического интерфейса в библиотеку, как я читал. Но как мне получить доступ к диспетчеру приложения, которое будет использовать библиотеку? Возможно ли это?

Я попытался Application.Current.Dispatcher и добавил ссылку на WindowBase (поскольку у меня не было возможности добавить System.Windows), но все еще не могу разрешить объект диспетчера.

Ответы [ 3 ]

25 голосов
/ 31 мая 2011

О, ха-ха (извините, но это одна из тех глупостей), класс Application определяется в PresentationFramework.dll. Вам нужно сослаться на это, чтобы иметь возможность получить доступ к диспетчеру через Application.Current.Dispatcher.

6 голосов
/ 31 мая 2011

У меня была та же проблема, т.е. не удалось разрешить Application.Current.Dispatcher, и в итоге я передал клиентский диспетчер графического интерфейса пользователя в библиотеку, которая просто содержит ссылку на Dispatcher (ссылка на WindowsBase + с помощью System.Windows.Threading).
Я предпочитаю эту опцию, чтобы моя библиотека без GUI должна была содержать ссылку на PresentationFramework.dll (что не кажется естественным).
Я думаю, это 6 из одного, полдюжины из другого ...

3 голосов
/ 31 мая 2011

Если вы убедитесь (например, в статических членах класса), что у вас есть удобная ссылка на пользовательский интерфейс Dispatcher, вы можете сделать это:

public static void Run( Action a ) {
    if ( !_uiDispatcher.CheckAccess() ) {
        _uiDispatcher.BeginInvoke( a );
    }
    else {
        a();
    }
}

Одна или две инфраструктуры MVVM IВы уже делали что-то вроде этого.

Если вы не хотите передавать эту ссылку Dispatcher в библиотеку, контейнеры IoC являются опцией.Вы также можете поместить это в Common.dll для классов и интерфейсов, на которые должны ссылаться как exe, так и библиотеки классов.Exe может установить правильную ссылку, а библиотека классов может вызвать метод Run().

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