SilverlightとWindows PhoneのBitmapImageの読み込みは非同期で行われる
以下のようなコードを実行した場合、WPFでは問題ありませんが、SilverlightやWindows Phoneでは最後の行の部分でInvalid pointerというメッセージと共にNullReferenceExceptionが発生します。
string name = Assembly.GetExecutingAssembly().FullName; AssemblyName asmName = new AssemblyName(name); BitmapImage image = new BitmapImage(new Uri("/" + asmName.Name + ";component/Images/Chrysanthemum.jpg", UriKind.RelativeOrAbsolute)); WriteableBitmap bitmap = new WriteableBitmap(image);
この現象はBitmapImageのCreateOptionsプロパティの既定値が異なることに起因します。WPFでは既定値はNoneですが、SilverlightやWindows PhoneではDelayCreationです。こちらのページでは既定値はNoneと書いてありますが、これは誤りです。
CreateOptionsプロパティをNoneに設定することで、上記の問題を解決することができます。
string name = Assembly.GetExecutingAssembly().FullName; AssemblyName asmName = new AssemblyName(name); BitmapImage image = new BitmapImage(); image.UriSource = new Uri("/" + asmName.Name + ";component/Images/Chrysanthemum.jpg", UriKind.RelativeOrAbsolute); image.CreateOptions = BitmapCreateOptions.None; WriteableBitmap bitmap = new WriteableBitmap(image);
上記のフォーラムの回答に書かれているほかの解決方法として、BitmapImageのImageOpenedイベントを使って読み込み完了後に処理を行うようにする方法もあります。