1

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) です ... これを修正する方法がわかりません。デバッガーを実行しました。シーンとモデルがレンダリングされ、画像の幅と高さがゼロになっていることに気付きました。この後、イベントが発火するのですが……わかりません。

前もって感謝します、

ホセ

4

1 に答える 1

1

まず、これは少し混乱します:-

    imageBrush.ImageSource = img;

    InitializeComponent();

非常に異常なことが起こっていない限り、imageBrushオブジェクトは が実行されるまで null になりますInitializeComponent

推測での質問に関しては、3D モデルを にロードしますMainPage_Loaded。問題は、ビットマップの到着とは非同期に発生することです。Loadedしたがって、とImageOpenedイベントの両方が発生するまで、実際に 3D モデルをロードする必要はありません。ImageOpenedそれが常に最後に起こると仮定するのは危険であることに注意してください。

私が考えることができる最も簡単な解決策は、MainPage_Loadedイベント内のすべての既存のコードをImageOpened移動してから、画像をフェッチするコードをMainPage_Loaded. ImageOpenedあなたの実行がページがロードされたことが保証されている場合、これはシーケンスをシリアル化します。

最も洗練されたソリューションではなく、SL の非同期の性質の利点を利用していません。ただし、それでうまくいくはずであり、ページの読み込みとビットマップのダウンロードを並行して実行することに利点があるかどうかを評価できます。

于 2009-11-20T11:45:06.403 に答える