WPF映像:加载的事件未被激发



我有一个WPF映像,我订阅了一些事件:

<Image Grid.Row="0" 
Source="{Binding Path=ImageSelected,  NotifyOnTargetUpdated=True, Converter={StaticResource imageToSourceConverter}}" 
Visibility="{Binding imageVisibility}" 
RenderTransformOrigin="0,0" 
SnapsToDevicePixels="True" 
MouseLeftButtonDown="myImage_MouseLeftButtonDown" 
MouseLeftButtonUp="myImage_MouseLeftButtonUp" 
MouseMove="myImage_MouseMove" 
OverridesDefaultStyle="False"
TargetUpdated="myImage_TargetUpdated"
Cursor="Hand"
RenderOptions.BitmapScalingMode="LowQuality" 
RenderOptions.EdgeMode="Aliased" 
Loaded="myImage_Loaded">

我注意到,除了Loaded事件之外,所有事件都被触发,我不明白为什么。我不知道这是否与其他事件相冲突。图像中触发的事件序列是什么?

你知道为什么会这样吗?

您正在经历的是该事件的预期行为。

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)。

希望能有所帮助。

最新更新