ScrollViewer中带有图像的StackPanel不显示图像

时间:2014-03-12 12:21:18

标签: c# windows-phone-7 windows-phone-8 windows-phone scrollview

我从IsolatedSotrage下载了很多图片,并在StackPanel的屏幕上显示它们。当我启动应用程序时,我没有看到手机中的图像(照片不可见(为什么?!)),但是当我锁定手机并解锁时我已经完成所有图片,一切正常。

为什么会这样?

XAML:

<ScrollViewer x:Name="ScrollViewer1">
    <StackPanel x:Name="myStackPanel"/>
</ScrollViewer>

C# - 将图像添加到StackPanel:

Image[] myImage = new Image[30];

for (int n = 1; n < 30; n++)
{
    myImage[n] = new Image();
    myImage[n].Source = getBitmap(n, "/image/");  
    myStackPanel.Children.Add(myImage[n]);       
}

从IsolatedStorage打开图像的方法:

public BitmapImage getBitmap(int n, string path)
{
    BitmapImage myBitmap = new BitmapImage();

    using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication())
    {
        if (store.FileExists(path + n.ToString() + ".jpg"))
        {
            using (var isoStream = store.OpenFile(path + n.ToString() + ".jpg", FileMode.Open, FileAccess.Read))
            {
                myBitmap.SetSource(isoStream);
                return myBitmap;
            }
        }
        else
        {
            return myBitmap= null;
        }
    }
}

目前我对这个问题有两个令人失望的解决方案:

当我删除ScrollViewer时,我没有任何问题,但我的图像在屏幕外。 但是当我使用网格并且我将每张图片保存在单独的网格中时,它可以工作,但加载图像需要更长的时间

Image[] myImage = new Image[30];

for (int n = 1; n < 30; n++)
{
    Grid myGrid = new Grid();
    myImage[n] = new Image();
    myImage[n].Source = getBitmap(n, "/image/");
    myGrid.Children.Add(myImage[n]);
    myStackPanel.Children.Add(myGrid);
}

修改

看起来像这样:

enter image description here

2 个答案:

答案 0 :(得分:2)

问题是当图像添加到StackPanel内时,它们没有宽度或高度。您可以通过添加以下内容来验证这一点,并且图像应该是可见的(这设置为全宽):

myImage[n].Width = 480;
myImage[n].Height = (float)myBitmap.PixelHeight / myBitmap.PixelWidth * 480;

Altought我可能会建议您在ListBox内使用StackPanel代替ScrollViewer。这可以通过以下XAML完成:

<ListBox x:Name="myListbox" />

更改代码以添加图像(也是在此循环中跳过索引0):

Image[] myImage = new Image[30];

for (int n = 0; n < 30; n++)
{
    myImage[n] = new Image();
    myImage[n].Source = getBitmap(n, "/image/");    
}
myListbox.ItemsSource = myImage;

在某些情况下,您可能还需要关闭延迟创建,这可以通过在位图上设置CreateOptions来完成。

BitmapImage myBitmap = new BitmapImage() { CreateOptions = BitmapCreateOptions.None };

答案 1 :(得分:1)

BitmapImage发生了ImageOpenedImageFailed事件。为这些事件添加处理程序并进行调试 - 查看是否正在触发ImageFailed事件,如果是,为什么。