如何在silverlight中获取图像属性?

时间:2009-11-20 11:12:41

标签: silverlight image synchronization events kit3d

我正在将图像加载到我的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)...我不知道如何解决这个问题。我已经运行了调试器,我注意到场景和模型被渲染,图片宽度和高度为零。在此之后,事件被解雇......我无法理解。

提前致谢,

何'

1 个答案:

答案 0 :(得分:1)

首先,这有点令人困惑: -

    imageBrush.ImageSource = img;

    InitializeComponent();

除非您发生了一些非常不寻常的事情,否则imageBrush对象将在InitializeComponent运行之后为空。

关于您的猜测,您可以在MainPage_Loaded中加载3D模型。然后问题是他与位图的到达异步发生。因此,在LoadedImageOpened事件都发生之前,您不希望实际加载3D模型。请注意,假设ImageOpened总是最后发生会很危险。

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

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