Tôi có một chuỗi nền tạo một chuỗi các đối tượng BitmapImage
. Mỗi khi chuỗi nền kết thúc tạo bitmap, tôi muốn hiển thị bitmap này cho người dùng. Vấn đề là tìm ra cách để vượt qua BitmapImage
từ chuỗi nền tới chuỗi giao diện người dùng.Làm thế nào để bạn vượt qua một BitmapImage từ một chuỗi nền đến chuỗi giao diện người dùng trong WPF?
Đây là một dự án MVVM, vì vậy quan điểm của tôi có một Image
yếu tố:
<Image Source="{Binding GeneratedImage}" />
xem mô hình của tôi có một tài sản GeneratedImage
:
private BitmapImage _generatedImage;
public BitmapImage GeneratedImage
{
get { return _generatedImage; }
set
{
if (value == _generatedImage) return;
_generatedImage= value;
RaisePropertyChanged("GeneratedImage");
}
}
xem mô hình của tôi cũng có mã mà tạo chủ đề nền:
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?
}
}
Tôi muốn bằng cách nào đó vượt qua backgroundThreadImage
vào chuỗi giao diện người dùng, nơi nó sẽ trở thành uiThreadImage
, sau đó đặt GeneratedImage = uiThreadImage
để chế độ xem có thể cập nhật. Tôi đã xem xét một số ví dụ đối phó với WPF Dispatcher
, nhưng tôi dường như không thể đưa ra một ví dụ giải quyết vấn đề này. Xin cho biết.
này là hữu ích, Simon, cảm ơn. Nhưng làm thế nào để có được xung quanh thực tế là, khi quá trình này bắt đầu, 'GeneratedImage' không được đặt thành một thể hiện của một đối tượng? – devuxer
@ DANM tất nhiên tôi đã không nghĩ về điều đó :) Bạn cũng có thể nắm giữ một Dispatcher thông qua 'Application.Current.Dispatcher' –
Tôi sợ điều này không làm điều đó. Tôi nhận được "Các chủ đề gọi không thể truy cập đối tượng này bởi vì một chủ đề khác nhau sở hữu nó." – devuxer