Listbox,WP7中的图像加载问题

时间:2011-08-09 12:03:17

标签: c# .net silverlight windows-phone-7

我有一个列表框,其中每个元素都有一个已经存储为内容的图像。 我选择使用转换器显示的图像。

如果相应值的图像不存在,我必须显示默认图像 我在ImageFailed事件中处理过。

问题在于,当我运行程序时,我将获得已存在的一些图像的默认图像。 如果我向下滚动列表框并再次备份,有时正确显示的图像将显示默认图像。 这似乎是一个性能问题。

我是应用程序开发的新手,让我知道任何细节,即使它对你来说似乎微不足道。

以下是我的实施

<ListBox DataContext="{Binding}">
    <ListBox.ItemTemplate>
        <DataTemplate>
                <StackPanel>
                            <Image Width="90" Height="67" Source="{Binding id,Converter={StaticResource imageConverter}}" ImageFailed="ImageFailed" />
                             _
                             _
                    </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

转换功能

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
       string Id = (string)value;
   string imagePath;
   imagePath = string.Format(AppDefines.channelLogoImgPath, prgSvcId);
   return imagePath;
}

ImageFailed处理程序

private void ImageFailed(object sender, ExceptionRoutedEventArgs e)
{
    Image Img = (Image)sender;
    string imgPath = Defines.defImagePath
    Uri uri = new Uri(imgPath, UriKind.RelativeOrAbsolute);
    BitmapImage bDefImage = new BitmapImage(uri);
    Img.Source = bDefImage;
}

4 个答案:

答案 0 :(得分:1)

问题是你的转换器返回一个字符串(图像的路径)而不是ImageSource。

你需要这样的东西:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
   string imagePath = string.Format(AppDefines.channelLogoImgPath, value);
   return new BitmapImage(imagePath); 
} 

正如Matt所说,你也没有使用你传递给转换器的id。上面的简化代码包括该修复。

答案 1 :(得分:1)

我有一个解决问题的方法,我把2张图像放在同一个位置。默认图像从一开始就设置为可见。 如上获得项目特定图像的源(绑定)。在项目特定图像的图像打开事件处理程序中,默认图像的可见性设置为折叠。

执行此操作后,应用程序在模拟器和设备上都能正常运行。目前我只能指责两件事。

图像失败事件。 在某些情况下,触发图像失败事件并显示图像。 (可能会有一些时间限制等使得事件被解雇)

列表框和图片不能一起使用。

答案 2 :(得分:0)

是不是因为您的Convert方法未使用传入的值但正在查找prgSvcId

如果您正在从XAP中加载图像,则可以测试它们的存在,而不是依赖于加载默认/替代图像的失败。

测试文件是否存在:

if (Application.GetResourceStream(new Uri("/images/myPic.png", UriKind.Relative)) != null)
{
    // file exists
}

答案 3 :(得分:0)

我看到同样的问题,我正在绑定一个url,然后使用服务和线程池在后台获取图像并将其加载回来。我在列表中创建了一个自定义控件,但依赖属性在控件中似乎是从列表中返回的随机URL。起初我认为这是某种同步问题,但我认为这是因为ListBox不像普通的SL列表框,因为它使用VirtualizingStackPanel。这里有一些指导原则:

http://blogs.msdn.com/b/slmperf/archive/2010/10/06/silverlight-for-windows-phone-7-listbox-scroll-performance.aspx

基本上不要尝试对列表做任何不寻常的事情!