我正在将图像加载到我的silverlight应用程序中。此图像将作为纹理贴图放入3d模型中。我需要获取图像属性。为此,我正在使用ImageOpened事件,如下所示:
public MainPage()
{
BitmapImage img = new BitmapImage(new Uri("imagens/textura.jpg", UriKind.Relative));
img.ImageOpened += new EventHandler<RoutedEventArgs>(img_ImageOpened);
img.ImageFailed += new EventHandler<ExceptionRoutedEventArgs>(img_ImageFailed);
imageBrush.ImageSource = img;
InitializeComponent();
this.Loaded += new RoutedEventHandler(MainPage_Loaded);
this.MouseLeftButtonUp += new MouseButtonEventHandler(MainPage_MouseLeftButtonUp);
(...)
然后:
private void img_ImageOpened(object sender, RoutedEventArgs e)
{
BitmapImage i = sender as BitmapImage;
ImgSize.Width = i.PixelWidth;
ImgSize.Height = i.PixelHeight;
MessageBox.Show("LOADED IMAGE SIZE\n W:" + ImgSize.Width.ToString() + " H:" + ImgSize.Height.ToString());
}
消息框显示已加载图片的正确值。但这是在加载场景后运行,因此大小始终是默认值(0,0)...我不知道如何解决这个问题。我已经运行了调试器,我注意到场景和模型被渲染,图片宽度和高度为零。在此之后,事件被解雇......我无法理解。
提前致谢,
何'
答案 0 :(得分:1)
首先,这有点令人困惑: -
imageBrush.ImageSource = img;
InitializeComponent();
除非您发生了一些非常不寻常的事情,否则imageBrush
对象将在InitializeComponent
运行之后为空。
关于您的猜测,您可以在MainPage_Loaded
中加载3D模型。然后问题是他与位图的到达异步发生。因此,在Loaded
和ImageOpened
事件都发生之前,您不希望实际加载3D模型。请注意,假设ImageOpened
总是最后发生会很危险。
我能想到的最简单的解决方案是将MainPage_Loaded
事件中的所有现有代码移至ImageOpened
,然后将获取图像的代码移至MainPage_Loaded
。这序列化序列,当ImageOpened
执行时,保证页面已加载。
不是最复杂的解决方案,也没有利用SL的异步特性。然而,它应该让你去,你可以评估是否有任何好处,使页面加载和位图下载并行运行。