2009-06-24 11 views
8

Mi sono strappato i capelli per questo problema per l'ultima ora o così.ImageSourceConverter lancia una NullReferenceException ... perché?

ho qualche codice che va in questo modo:

videoTile.Icon = new ImageSourceConverter().ConvertFrom(coDrivr4.Properties.Resources.Music.GetHbitmap()) as ImageSource; 

Quando eseguo il mio codice, si dice si è verificato un NullReferenceException. Né "Musica" né il ritorno di GetHbitmap() sono nulli.

Sto cercando di ottenere l'immagine tramite le Proprietà perché è l'unico modo in cui ho capito come accedere alle immagini nella mia cartella Risorse. Li aggiungerei semplicemente al file app.xaml come risorsa, ma non sto utilizzando un file app.xaml per alcuni motivi.

Sto tentando di sbagliare? Tutto quello che devo fare è ottenere un oggetto ImageSource di un'immagine che ho nella mia directory delle risorse. Posso usarli bene nel mio XAML, ma non posso farlo in alcun codice per la vita di me.

P.S .: Non posso semplicemente aggiungerli come risorsa al file XAML perché questa è solo una classe e quindi non esiste un file XAML.

+0

Ci devono essere alcune informazioni aggiuntive nel gruppo di eccezioni completo – moogs

+0

Si potrebbe pensare che ma non c'è letteralmente nulla. System.NullReferenceException non gestito Messaggio: oggetto non impostato su un'istanza di un oggetto. Source = PresentationCore StackTrace: a System.Windows.Media.ImageSourceConverter.ConvertFrom (contesto ITypeDescriptorContext, CultureInfo, Object value) al System.ComponentModel.TypeConverter.ConvertFrom (Object value) a coDrivr4.Conductor.PopulateDefaultApplicationTiles() in ... InnerException: –

+0

Devo anche sottolineare che sto utilizzando VS2010 e .NET 4.0. Non è molto sicuro che ciò faccia molta differenza, ma hey, è beta. –

risposta

5

Bene, hai un sacco di cose che potrebbe essere essere nullo. Vi suggerisco di separare fuori:

Bitmap bitmap = coDrivr4.Properties.Resources.Music; 
object source = new ImageSourceConverter().ConvertFrom(bitmap.GetHbitmap()); 
ImageSource imageSource = (ImageSource) source; 
videoTile.Icon = imageSource; 

Nota l'uso di un cast piuttosto che il as dell'operatore qui. Se sourcenon è un ImageSource, questo genererà un InvalidCastException che sarà molto più descrittivo che finire semplicemente come riferimento null. EDIT: Okay, quindi ora sappiamo per certo che sta accadendo in ConvertFrom, suggerisco che il prossimo passo è scoprire se si tratta di un bug in .NET 4.0 beta 1. Stai effettivamente utilizzando alcune funzionalità di .NET 4.0? Ti suggerisco di provare ad estrarre solo quel bit di codice in un progetto separato (non hai bisogno di visualizzare un'API, basta convertire l'immagine. Prova ad eseguire quel codice in .NET 3.5. Se fallisce nello stesso modo È stata eliminata la beta-nità dall'elenco di possibili problemi

+0

Anche questo non lo è. Lo stesso errore si verifica sulla riga 'object source = ...'. –

+0

Giusto - ma la cosa importante è che abbiamo stabilito che è decisamente in ConvertFrom. Certo, l'avremmo visto immediatamente dalla traccia dello stack ... –

+0

Quindi qual è il prossimo passo? Ho esaurito le idee per testare cosa non ha funzionato a questo punto. –

0

Provare a inserire il valore restituito di coDrivr4.Properties.Resources.Music.GetHbitmap() in una variabile temporanea e vedere se è nullo, potrebbe essere il punto da cui proviene il valore null.

+0

Non è assolutamente nullo, in base sia al debugger che al mio test rapido in-code. –

8

Ho raggiunto esattamente lo stesso problema: ho tutte le mie immagini bitmap in un file di risorse tipicamente, staticamente digitato e voglio solo impostare un ImageSource con loro . Quindi, dal momento che l'ImageSourceConverter stava gettando eccezioni riferimento null, ho cambiato tack e usato questo pezzo di codice invece:.

Bitmap bitmap = entityCol.EntityCollectionImage; 
this.Image = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(bitmap.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); // Image is an image source 

Speranza che aiuta

+1

Funziona perfettamente. Il metodo ConvertFrom genera ancora una eccezione NullReferenceException, anche se l'oggetto che ho passato non è nullo (ho verificato due volte con il debugger di Visual Studio). – MrAsterisco

1

Prima dell'uso ConvertFrom salvare il bitmap per MemoryStream

Bitmap canvas = new Bitmap(secScreen.Bounds.Width, secScreen.Bounds.Height); 
Graphics g = Graphics.FromImage(canvas); 
g.Clear(System.Drawing.Color.Yellow); 

MemoryStream stream = new MemoryStream(); 
canvas.Save(stream, System.Drawing.Imaging.ImageFormat.Png); 
ImageSource isrg = (ImageSource)new ImageSourceConverter().ConvertFrom(stream); 
1

Questo non è un bug in NET Framework, questa eccezione riferimento null si verifica perché l'ImageSourceConverter non può convertire un oggetto di tipo Bitmap, può convertire: Stream, string, Uri, byte [], quindi devi cambiare il tuo codice in qualcosa del genere:

var imageSourceConverter = new ImageSourceConverter(); 
byte[] tempBitmap = BitmapToByte(eventArgs.Frame); 
ImageSource image = (ImageSource)imageSourceConverter.ConvertFrom(tempBitmap); 

...

private byte[] BitmapToByte(Bitmap bitmap) 
{ 
    byte[] byteArray; 
    using (MemoryStream stream = new MemoryStream()) 
    { 
     bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp); 
     stream.Close(); 

     byteArray = stream.ToArray(); 
    } 
    return byteArray; 
} 
Problemi correlati