2009-11-20 36 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