我有一个WPF图像,我订阅了一些事件:
Dim user_ As String
user_ = UserName
我注意到除了Loaded事件之外所有事件都被触发了,我不明白为什么。我不知道它是否与其他一些事件发生冲突。哪个是图像中触发的事件序列?
任何想法为什么会发生?
答案 0 :(得分:1)
您遇到的是该事件的预期行为。
Loaded
事件:
在布置,渲染和准备元素时发生 相互作用。
我们正在讨论控制事件。当控件(而不是您加载到其中的图像)被布局,渲染并准备好进行交互时,此事件将被触发一次。
如果您正在寻找一个"告诉"你加载图像本身。
如果您需要它,并且您显示的图像不在本地,但通过HTTP下载,则可以使用DownloadCompleted
事件。它由BitmapSource
类提供。它需要你将Image控件绑定到BitmapSource,而不是提供和Uri
,因为我现在怀疑是这种情况。
我所知道的唯一选择是手动执行此操作,这通常会为您提供更大的灵活性。样本可以是以下(未经测试的代码):
private void UpdateImageFromBuffer(byte[] yourBuffer)
{
ThreadPool.QueueUserWorkItem(delegate {
try {
SelectedImageLoaded = false; // Set the notification Property and notify that image is being loaded.
using (MemoryStream memoryStream = new MemoryStream(yourBuffer)) // Remember to provide the yourBuffer variable.
{
var imageSource = new BitmapImage();
imageSource.BeginInit();
imageSource.StreamSource = memoryStream;
imageSource.EndInit();
ImageSelected = imageSource; // Assign ImageSource to your ImageSelected Property.
}
} catch (Exception ex) {
/* You might want to catch this */
} finally {
SelectedImageLoaded = true; // Notify that image has been loaded
}
});
}
首先,将图像加载到另一个线程,无论如何你都不太可能想在UI线程上执行此操作。取决于你需要做什么"图像加载通知"你需要调整上面的代码。
假设您要根据发生的情况更新UI,例如显示进度条或加载动画。在这种情况下,上面的代码将SelectedImageLoaded
属性设置为图像的当前状态。您需要做的就是将UI控件正确绑定到该属性以使UI更新(注意:类必须实现INotifyPropertyChanged )。
希望有所帮助。