【问题标题】:Silverlight: Getting image (from OpenFileDialog) width/heightSilverlight:获取图像(来自 OpenFileDialog)的宽度/高度
【发布时间】:2009-02-05 13:18:34
【问题描述】:

在从 URI 创建位图时,我一直在使用 BitmapImage.DownloadProgress 事件来等待图像被加载。那就是我可以在下载完成后使用事件处理程序来检查 Image.ActualWidth/ActualHeight。这很好用。

但是当我加载用户从他们的计算机中选择的图像时,DownloadProgress 是无用的。

这适用于 URI 位图:

private void LoadImage(Uri uri)
{
    this.ResetProgressImage();
    BitmapImage image = new BitmapImage();            
    image.DownloadProgress += new EventHandler<DownloadProgressEventArgs>(LoadImageDownloadProgress);
    image.UriSource = uri;
    this.ImageFull.Source = image;
}

private void LoadImageDownloadProgress(object sender, DownloadProgressEventArgs e)
{
    this.Dispatcher.BeginInvoke(delegate
    {
        this.ProgressImage.Value = e.Progress;
        if (e.Progress == 100)
        {
            ImageHelper.Current.Width = Math.Round(this.ImageFull.ActualWidth);
            ImageHelper.Current.Height = Math.Round(this.ImageFull.ActualHeight);
        }
    });
}

但这在从流中获取 BitmapImage 时不起作用:

private void LoadImage(Stream stream)
{
    this.ResetProgressImage();
    BitmapImage image = new BitmapImage();            
    image.DownloadProgress += new EventHandler<DownloadProgressEventArgs>(LoadImageDownloadProgress);            
    image.SetSource(stream);
    this.ImageFull.Source = image;
}

在使用 SetSource(stream) 时,有人知道 DownloadProgress 的替代方法吗?

【问题讨论】:

  • 请给正确答案投票。

标签: c# silverlight image


【解决方案1】:

BitmapImage 中没有使用流监控加载进度的事件。

但是,如果您只需要图像尺寸,则可以将图像添加到层次结构中并等待“Loaded”或“LayoutUpdated”事件。

【讨论】:

  • 谢谢 BC,这是个好主意。它确实有效,但是您必须记住在使用 EventHandler 后将其删除,否则我的事件会触发其他布局更改。当我在等待答案时,解决方案是创建一个单独的 Thread 和 Thread.Sleep(200) 然后调用我的方法,这也有效,但看起来有点像黑客。谢谢你的帮助!芬德尔
猜你喜欢
  • 2013-06-19
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-23
相关资源
最近更新 更多