2009-06-24 10 views
8

Ich habe mir in der letzten Stunde die Haare aus diesem Problem gerissen.ImageSourceConverter löst eine NullReferenceException ... warum?

Ich habe einige Code, der so geht:

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

Wenn ich meinen Code ausführen, heißt es ein Nullreferenceexception aufgetreten. Weder "Musik" noch die Rückgabe von GetHbitmap() sind null.

Ich versuche, das Bild über die Eigenschaften zu erhalten, weil es die einzige Möglichkeit ist, wie ich auf die Bilder in meinem Resources-Ordner zugreifen kann. Ich würde sie nur zur app.xaml-Datei als Ressource hinzufügen, aber ich verwende aus einigen Gründen keine app.xaml-Datei.

Versuche ich das falsch? Alles, was ich tun muss, ist ein ImageSource-Objekt eines Bildes, das ich in meinem Resource-Verzeichnis habe. Ich kann sie gut in meinem XAML verwenden, aber ich kann es nicht für mein Leben in irgendeinem Code tun.

P.S .: Ich kann sie nicht einfach als Ressource zur XAML-Datei hinzufügen, da dies nur eine Klasse ist und daher keine XAML-Datei existiert.

+0

Es muss einige zusätzliche Informationen in der vollständigen Ausnahme Stack – moogs

+0

Sie würden denken, aber es gibt buchstäblich nichts. Dies ist, was aus "Exception-Details in die Zwischenablage kopieren" kommt: System.NullReferenceException wurde nicht behandelt Message = Objektreferenz nicht auf eine Instanz eines Objekts festgelegt. Source = PresentationCore Stacktrace: bei System.Windows.Media.ImageSourceConverter.ConvertFrom (ITypeDescriptorContext Kontext, Culture Kultur, Objektwert) bei System.ComponentModel.TypeConverter.ConvertFrom (Objektwert) bei coDrivr4.Conductor.PopulateDefaultApplicationTiles() in ... InnerException: –

+0

Ich sollte auch darauf hinweisen, dass ich VS2010 laufen und .NET 4.0. Ich bin mir nicht sicher, ob das einen großen Unterschied macht, aber hey, es ist beta. –

Antwort

5

Nun, Sie haben viele Dinge, die könnte Null dort sein. Ich schlage vor, Sie sie trennen:

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

Beachten Sie die Verwendung eines gegossenen statt der as Operator hier. Wenn sourcenicht ein ImageSource ist, wird dies eine InvalidCastException werfen, die viel beschreibender als nur als NULL-Verweis enden wird.

EDIT: Okay, jetzt wissen wir sicher, dass es in ConvertFrom passiert, ich schlage vor, der nächste Schritt ist herauszufinden, ob es ein Bug in .NET 4.0 Beta 1 ist. Verwenden Sie tatsächlich .NET 4.0-Funktionen? Ich schlage vor, Sie versuchen, nur das Bit des Codes in ein separates Projekt zu extrahieren (Sie müssen nicht eine API anzeigen, nur das Bild konvertieren. Versuchen Sie, diesen Code in .NET 3.5 auszuführen. Wenn es auf die gleiche Weise fehlschlägt , das hat den beta-ness aus der Liste der möglichen Probleme eliminiert

+0

Das ist es auch nicht. Derselbe Fehler löst die Zeile 'object source = ...' aus. –

+0

Richtig - aber das Wichtigste ist, dass wir festgestellt haben, dass es definitiv in ConvertFrom ist. Zugegeben, wir hätten das sofort von der Stack-Spur gesehen ... –

+0

Also, was ist der nächste Schritt? Ich habe keine Ideen mehr, um zu testen, was an diesem Punkt schief läuft. –

0

Versuchen Sie, den Rückgabewert von coDrivr4.Properties.Resources.Music.GetHbitmap() in eine temporäre Variable und sehen, ob es Null ist - das kann sein, wo Ihre Null kommt.

+0

Es ist definitiv nicht null, sowohl nach dem Debugger und meinem schnellen In-Code-Test. –

8

Ich traf genau das gleiche Problem - ich habe alle meine Bitmaps in einer netten, statisch getippten Ressourcendatei und ich möchte nur eine ImageSource mit ihnen setzen . Also, da die ImageSourceConverter null Referenz Ausnahmen werfen, änderte es Tack und verwendet, um dieses Stück Code statt.

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

Hoffnung, die hilft

+1

Das funktioniert einwandfrei. Die ConvertFrom-Methode löst weiterhin eine NullReferenceException aus, auch wenn das übergebene Objekt nicht null ist (ich habe dies mit dem Visual Studio-Debugger überprüft). – MrAsterisco

1

Vor Gebrauch ConvertFrom speichern Sie Ihre Bitmap

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

Dies ist kein Fehler in .NET Framework Memory, diese NULL-Verweis Ausnahme tritt auf, weil die ImageSourceConverter nicht ein Bitmap-Typ-Objekt konvertieren kann, kann es zu konvertieren: Bach, string, Uri, byte [], so müssen Sie Ihren Code in etwa wie folgt ändern:

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

...

Verwandte Themen