2009-11-20 37 views
1

我正在将图像加载到我的Silverlight应用程序中。该图像将作为纹理贴图装入3D模型中。我需要获取图像属性。对于我使用ImageOpened事件,像这样:如何在Silverlight中获取图像的属性?

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()); 

    } 

MessageBox的是显示了加载图片的正确值。但这是在场景加载后运行的,所以大小总是默认(0,0)......我不知道如何解决这个问题。我运行了调试器,我注意到场景和模型被渲染,图片的宽度和高度都是零。在此之后,事件被解雇......我无法弄清楚。

由于提前,

何塞”

回答

1

首先,这是一个有点混乱: -

imageBrush.ImageSource = img; 

    InitializeComponent(); 

除非你有一些相当不寻常发生的imageBrush对象将是空的,直到后InitializeComponent已运行。

至于你的猜测,你在加载3D模型MainPage_Loaded。接下来的问题是他与位图的到达不同步。因此,在两个LoadedImageOpened事件都发生之前,您不想实际加载3D模型。请注意,假设ImageOpened将始终发生将是危险的。

我能想到的最简单的解决方案是将MainPage_Loaded事件中的所有现有代码移动到ImageOpened,然后将获取图像的代码移动到MainPage_Loaded。这个序列化的序列,当执行ImageOpened你保证页面已经加载。

不是最复杂的解决方案,也不利用SL异步特性的好处。然而,它应该让你继续下去,你可以评估是否有页面加载和位图下载并行运行的好处。

+0

我不能这样做,因为我有很多对象,这取决于PageLoaded ..我正在使用Kit3D加Silverlight ..我有视口,网格和东西...当我指向imageBrush.ImageSource到img ,因为我认为这不取决于InitComponent(这是用于UI的东西) – jose 2009-11-20 12:08:19

+0

我想我看不到足够的代码来告诉,例如什么'MainPage'派生自你的当前问题不可用。无论如何,您都需要将渲染与图像信息的可用性进行同步。它仍然不清楚为什么你不能将当前在PageLoaded中的代码推迟到ImageOpened事件。 – AnthonyWJones 2009-11-20 13:28:32