WPF图像:未被触发的已加载事件

时间:2017-10-17 13:51:03

标签: c# wpf events visual-studio-2008 wpf-controls

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

Dim user_ As String
    user_ = UserName

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

任何想法为什么会发生?

1 个答案:

答案 0 :(得分:1)

您遇到的是该事件的预期行为。

Loaded事件:

  

在布置,渲染和准备元素时发生   相互作用。

我们正在讨论控制事件。当控件(而不是您加载到其中的图像)被布局,渲染并准备好进行交互时,此事件将被触发一次。

如果您正在寻找一个"告诉"你加载图像本身。

DownloadCompleted

如果您需要它,并且您显示的图像不在本地,但通过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 )。

希望有所帮助。

相关问题