我有一个列表框,其中每个元素都有一个已经存储为内容的图像。 我选择使用转换器显示的图像。
如果相应值的图像不存在,我必须显示默认图像 我在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;
}
答案 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。这里有一些指导原则:
基本上不要尝试对列表做任何不寻常的事情!