簡體   English   中英

Silverlight 4 BitmapImage錯誤:在SetSource()之后未調用ImageOpened

[英]Silverlight 4 BitmapImage bug : ImageOpened not invoked after SetSource()

這似乎是一個嚴重的錯誤:

        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. 
        }

我正在經歷一個非常奇怪的behivour。 我的計算機上運行此代碼,它可以工作 - 當您在LayoutRoot上拖動JPG時,我可以在bmpImg_ImageOpened()內部中斷。

但是在不同的機器上它將無法工作 - 當拖動JPG時,我可以在drop事件中中斷,但在SetSource()之后沒有任何反應:沒有拋出異常,並且不調用回調。

我在另一台機器上試過它,它也沒用。

編輯:在所有機器上,添加Image類並將其Source屬性設置為bitmapImage時,圖像顯示正常。 所以我猜這是回調問題。 這還不夠,因為我仍然需要這些事件。

我在這里敲我的頭,它會是什么?

你必須設置

bitmapImage.CreateOptions = BitmapCreateOptions.None;

然后觸發ImageOpened事件。 這是因為默認選項是CreateDelayed

問候

Christian http://www.wpftutorial.net

這就是Silverlight一直表現的方式。 ImageOpened僅在下載和解碼圖像時觸發(即使用Source )。 使用SetSource時不會觸發它。 如果您在加載圖像后需要訪問尺寸,請使用WriteableBitmap作為PixelWidthPixelHeight屬性(而不是BitmapImage )或執行以下操作:

img.Source = bmpImg;
Dispatcher.BeginInvoke(() =>
{
   FakeImageOpened(); // Do logic in here
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM