[英]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
作為PixelWidth
和PixelHeight
屬性(而不是BitmapImage
)或執行以下操作:
img.Source = bmpImg;
Dispatcher.BeginInvoke(() =>
{
FakeImageOpened(); // Do logic in here
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.