2016-09-02 3 views
0

Я работаю над приложением wpf. Я хочу создать объект FlowDocument и распечатать его. Поскольку шаг создания занимает несколько секунд и замораживает пользовательский интерфейс, я перехожу мой код в новый поток. Проблема в том, что мне нужно установить изображение в FlowDocument и вам нужно создать Image UIElement, но элементы управления пользовательским интерфейсом не могут быть созданы в фоновом потоке! Я также пробовал так много сценариев Dispather.Invoke(), но они улавливают исключение из потока объектов.Вставка изображения в FlowDocument

Интересно, есть ли какие-либо другие способы вставки изображения в FlowDocument? Или можно создать Image UIElement в фоновом потоке?

любое предложение будет оценено.

P.S: Некоторый Пример код =>

BitmapImage bitmapImage = SingletonSetting.GetInstance().Logo; 
Image v = new Image() { Source = bitmapImage }; 
currnetrow.Cells.Add(new TableCell(new BlockUIContainer(v))); 




Image v = ((App)Application.Current).Dispatcher.Invoke(new Func<Image>(() => 
{ 
    BitmapImage bitmapImage = SingletonSetting.GetInstance().Logo; 
    return new Image() { Source = bitmapImage}; 
})); 
currnetrow.Cells.Add(new TableCell(new BlockUIContainer(v))); 

ответ

1

Если вам не нужно изменять BitmapImage, то вы можете заморозить его и использовать его в потоке пользовательского интерфейса.

// Executing on non UI Thread 
BitmapImage bitmapImage = SingletonSetting.GetInstance().Logo; 
bitmapImage.Freeze(); // Has to be done on same thread it was created on - maybe freeze it in the Singleton instead? 

Application.Current.Dispatcher.Invoke(() => { 
    // Executing on UI Thread 
    Image v = new Image() { Source = bitmapImage }; 
    currnetrow.Cells.Add(new TableCell(new BlockUIContainer(v))); 
}); 

После беседы с вами, что вы на самом деле нужно сделать было запустить задачу в STA потоке, так как вы делали интерфейс управления на нем. Как это сделать? Смотрите этот ответ:

Set ApartmentState on a Task

+0

спасибо за ваш ответ, но это может вызвать исключение в последней строке. Он говорит: «Вызывающий поток не может получить доступ к этому объекту, потому что ему принадлежит другой поток» – Evil

+0

строка currnetrow.Cells ...? На какой поток был сделан токнетроу? –

+0

да, фоновая нить создайте его! Я полагаю, что использование currentrow в потоке пользовательского интерфейса является проблемой! – Evil

Смежные вопросы