Silverlight 4 BitmapImage错误:在SetSource()之后未调用ImageOpened

时间:2011-09-14 17:23:58

标签: c# silverlight silverlight-4.0 bitmap bitmapimage

这似乎是一个严重的错误:

        private void LayoutRoot_Drop(object sender, DragEventArgs e)
        {
            if ((e.Data != null) && (e.Data.GetDataPresent(DataFormats.FileDrop)))
            {
                FileInfo[] files = (FileInfo[])e.Data.GetData(DataFormats.FileDrop);

                using (FileStream fileStream = files[0].OpenRead())
                {
                    //Code reaching this point.
                    BitmapImage bmpImg = new BitmapImage();
                    bmpImg.ImageOpened += new EventHandler<RoutedEventArgs>(bmpImg_ImageOpened);
                    bmpImg.ImageFailed += new EventHandler<ExceptionRoutedEventArgs>(bmpImg_ImageFailed);
                    try
                    {
                        bmpImg.SetSource(fileStream);                        
                    }
                    catch
                    {
                        //Code dosen't reach here.                        
                    }
                }
            }          
        }

        void bmpImg_ImageFailed(object sender, ExceptionRoutedEventArgs e)
        {
            //Code dosen't reach here. 
        }

        void bmpImg_ImageOpened(object sender, RoutedEventArgs e)
        {
            //Code dosen't reach here. 
        }

我正在经历一个非常奇怪的傻瓜。在我的电脑上运行此代码,它可以正常工作 - 当您在LayoutRoot上拖动JPG时,我可以在bmpImg_ImageOpened()内部中断。

但是在不同的机器上它将无法工作 - 当拖动JPG时,我可以在drop事件中中断,但在SetSource()之后没有任何反应:没有抛出异常,并且没有调用回调。

我在另一台机器上尝试过它也没用。

编辑: 在所有机器上,添加Image类并将其Source属性设置为bitmapImage时,图像显示正常。所以我猜这是回调问题。这还不够,因为我仍然需要这些事件。

我在这里敲我的头,它会是什么?

2 个答案:

答案 0 :(得分:1)

这就是Silverlight一直表现的方式。 ImageOpened仅在下载和解码图像时触发(即使用Source)。使用SetSource时不会触发。如果您在加载图片后需要访问尺寸,请使用WriteableBitmapPixelWidth属性(而不是PixelHeight)或执行以下操作:

BitmapImage

答案 1 :(得分:1)

你必须设置

bitmapImage.CreateOptions = BitmapCreateOptions.None;

然后触发ImageOpened事件。这是因为默认选项是CreateDelayed

问候

基督教 http://www.wpftutorial.net