Ошибка Silverlight 4 BitmapImage: ImageOpened не вызывается после SetSource () - PullRequest
3 голосов
/ 14 сентября 2011

Это похоже на серьезную ошибку:

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

Я испытываю очень странный вид. Запустив этот код на моем компьютере , он работает - когда вы перетаскиваете JPG на LayoutRoot, я могу взломать bmpImg_ImageOpened ().

Но на другой машине это не сработает - при перетаскивании JPG я могу прервать событие отбрасывания, но после SetSource () ничего не происходит: не генерируются исключения и не выполняются обратные вызовы Вызваны.

Я попробовал его на другой машине, и он тоже не работал.

редактировать: На всех машинах при добавлении класса Image и установке его свойства Source в bitmapImage изображение отображается нормально. поэтому я думаю, что это проблема с обратными вызовами. Этого недостаточно, потому что мне все еще нужны эти события.

Я тут бьюсь головой, что бы это могло быть?

Ответы [ 2 ]

1 голос
/ 28 июня 2013

Вы должны установить

bitmapImage.CreateOptions = BitmapCreateOptions.None;

Затем запускается событие ImageOpened. Это потому, что параметры по умолчанию: CreateDelayed

Привет

Christian http://www.wpftutorial.net

1 голос
/ 15 февраля 2012

Это просто, как Silverlight всегда вел себя. ImageOpened срабатывает только в том случае, если изображение загружено и декодировано (то есть с использованием Source). Не срабатывает при использовании SetSource. Если вам нужен доступ к размерам после загрузки изображения, либо используйте WriteableBitmap для свойств PixelWidth и PixelHeight (вместо BitmapImage), либо сделайте что-то вроде:

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