Mam wątek tła, który generuje szereg obiektów BitmapImage
. Za każdym razem, gdy wątek tła kończy generowanie bitmapy, chciałbym pokazać tę bitmapę użytkownikowi. Problem polega na tym, aby dowiedzieć się, jak przekazać BitmapImage
z wątku tła do wątku interfejsu użytkownika.Jak przekazać bitmapimage z wątku tła do wątku interfejsu użytkownika w WPF?
Jest to projekt MVVM, więc moim zdaniem ma Image
element:
<Image Source="{Binding GeneratedImage}" />
Moim zdaniem model ma właściwość GeneratedImage
:
private BitmapImage _generatedImage;
public BitmapImage GeneratedImage
{
get { return _generatedImage; }
set
{
if (value == _generatedImage) return;
_generatedImage= value;
RaisePropertyChanged("GeneratedImage");
}
}
Moim zdaniem model posiada również kod tworzy wątek tła:
public void InitiateGenerateImages(List<Coordinate> coordinates)
{
ThreadStart generatorThreadStarter = delegate { GenerateImages(coordinates); };
var generatorThread = new Thread(generatorThreadStarter);
generatorThread.ApartmentState = ApartmentState.STA;
generatorThread.IsBackground = true;
generatorThread.Start();
}
private void GenerateImages(List<Coordinate> coordinates)
{
foreach (var coordinate in coordinates)
{
var backgroundThreadImage = GenerateImage(coordinate);
// I'm stuck here...how do I pass this to the UI thread?
}
}
Chciałbym jakoś przejść backgroundThreadImage
do wątku interfejsu użytkownika, gdzie będzie to uiThreadImage
, a następnie ustaw GeneratedImage = uiThreadImage
, aby można było zaktualizować widok. Przyjrzałem się kilku przykładom dotyczącym WPF Dispatcher
, ale nie mogę wymyślić przykładu, który rozwiązuje ten problem. Proszę doradź.
Jest to pomocne, Simon, dzięki. Ale jak mogę obejść fakt, że kiedy ten proces się rozpoczyna, "GeneratedImage" nie jest ustawione na instancję obiektu? – devuxer
@DanM, oczywiście, nie myślałem o tym :) Można również uzyskać dyspozytora za pośrednictwem 'Application.Current.Dispatcher' –
Obawiam się, że to też nie robi. Otrzymuję "wątek wywołujący nie może uzyskać dostępu do tego obiektu, ponieważ inny wątek jest jego właścicielem." – devuxer