我有一个wpf ListBox,每个项目都有一个列表需要从服务器下载的图像-列表定义如下所示:

<ListBox x:Name="List" BorderThickness="0" AlternationCount="2" ItemContainerStyle="{StaticResource alternatingWithBinding}" 
     HorizontalContentAlignment="Stretch"  ScrollViewer.HorizontalScrollBarVisibility="Hidden">
<ListBox.ItemTemplate>
    <DataTemplate>
        <Grid x:Name="itemsGrid" Margin="3" ShowGridLines="False" >
            <Grid.RowDefinitions>
                <RowDefinition Height="59"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="45" />
                <ColumnDefinition Width="60" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="150" />
            </Grid.ColumnDefinitions>

            <Button x:Name="btn" Grid.Column="0" HorizontalAlignment="Left" VerticalAlignment="Center" Tag="{Binding}" 
                CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}" />
            <Image x:Name="Thumb" Grid.Column="1" Stretch="Uniform" Opacity="1.0" Source="{Binding Path=Image, Converter={StaticResource ImageConverter}}" Height="65" VerticalAlignment="Center"/>
            <TextBlock x:Name="Name" Grid.Column="2" Padding="2" Margin="17,0" VerticalAlignment="Center" Text="{Binding Path=Name}"
                       Tag="{Binding}" />
        </Grid>
        <DataTemplate.Triggers>
            ...
        </DataTemplate.Triggers>
    </DataTemplate>
</ListBox.ItemTemplate>

转换器看起来像:

    public class ImageConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
            if (value is string)
            {
                value = new Uri((string)value);
            }

            if (value is Uri)
            {
                BitmapImage bi = new BitmapImage();
                bi.BeginInit();
                bi.DecodePixelWidth = 150;
                bi.UriSource = value;
                bi.DownloadFailed += new EventHandler<ExceptionEventArgs>(bi_DownloadFailed);
                bi.EndInit();
                return bi;
            }

            return null;
    }

想法是当sourceUrl从服务器返回任何内容时显示默认图像。 但是由于我在XAML代码中使用转换器,

Source="{Binding Path=Image, Converter={StaticResource ImageConverter}}"

我不确定如何拦截这种情况。 我看到BitmapImage具有DownloadFailed事件,这对我来说是完美的,我只是不知道如何在这种情况下使用它。

#1楼 票数:1

您是否查看了Binding类的TargetNullValue属性?

如果您无法下载文件,我希望Converter返回null。


 public object Convert(object value, Type targetType, 
  object parameter, System.Globalization.CultureInfo culture)
{

  if (parameter.ToString()=="blue")
  {
    return new Uri("Butterfly1.png", UriKind.RelativeOrAbsolute);
  }
  return null;
}

然后在XAML中设置默认图像

<Window.Resources>
<my:ImageConverter x:Key='ImageConverter1' />
<BitmapImage x:Key='defaultImage'
             UriSource='/WpfApplication1;component/default.png' />


然后在绑定中指定TargetNullValue。


 <Image   Source='{Binding Converter={StaticResource ImageConverter1},
  ConverterParameter="red",TargetNullValue={StaticResource defaultImage}}'
         Height='100' />
<Image   Source='{Binding Converter={StaticResource ImageConverter1},
  ConverterParameter="blue",TargetNullValue={StaticResource defaultImage}}'
         Height='100' />

#2楼 票数:0

嗯...。我认为下载发生在EndInit上,这一点很重要。 由于您将静态资源用于转换器,因此最终每个应用程序只有一个实例。 这意味着,如果您创建一个范围为类级别的变量,并使用该变量来存储下载的结果,则可能会遇到问题,如果您对两次转换之间的变量状态不满意。 但是,由于UI是在单个线程中呈现的,因此您不必担心太多。

public class ImageConverter : IValueConverter
{
    private static readonly BitmapImage _default = MakeDefault();
    private bool _downloadFailed;

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
        if (value is string)
        {
            value = new Uri((string)value);
        }

        if (value is Uri)
        {
            _downloadFailed = false;
            BitmapImage bi = new BitmapImage();
            bi.BeginInit();
            bi.DecodePixelWidth = 150;
            bi.UriSource = value;
            // the event handler sets _downloadFailed to true!
            bi.DownloadFailed += bi_DownloadFailed;
            bi.EndInit();
            // unhook so we don't unintentionally keep the instance alive
            // this is important; you will leak BI instances otherwise!
            bi.DownloadFailed -= bi_DownloadFailed;
            if(_downloadFailed)                
              return _default;
            return bi;
        }

        return null;
}

  ask by user350213 translate from so

未解决问题?本站智能推荐:

1回复

WPF聊天列表框-具有用户图像显示

您好,我正在使用WPF聊天应用程序,我想将用户照片保存在数据库中,我想将每个人的照片与他/她的照片一起加载到朋友列表框中,这是我当前的代码,但我不知道如何从此开始。 我知道如何使用Xaml代码将项目添加到列表框中,如下所示: 但是我不知道用C#代码来做到这一点... 我如何将用户照片
2回复

列表框显示水平图像WPF

我正在尝试在wpf / xaml中创建一个控件,它将显示一个水平的图像列表。 要修复的列表框的宽度(无滚动条)。 添加新项目时,现有项目会减少显示的图像数量以容纳它(实际图像不会仅减少所显示图像的数量)。 该功能类似于向具有相对宽度属性(“*”)的网格添加新列,并且该列包含具有固定宽度的图
1回复

WPF列表框与文本和图像

我需要创建一个包含字符串和图像(某些项目是文本,其他-images)作为元素的排序列表。 我必须从后面的代码而不是xaml中配置此列表。 我创建了一个类: 作为内容,我有TextBlock或Image对象。 我的列表框如下所示: var list = new ObservableC
1回复

WPF:剪切并保存图像

我正在寻找一种旋转图像的方法,以便在此图像中剪切一个矩形并将其另存为单独的图片。 编辑:请参阅已接受的解决方案答案
1回复

WPF图像列表框,如何根据情况动态更改图像

我是WPF的新手,正在探索列表框控件。 我创建了一个列表框,项目代表图像加文本。 XAML代码: 绑定允许在启动时正确设置项目和图像。 码: 我想知道如何在按一下按钮时根据某些条件更改图像(例如,根据外部条件而不是基于“ onselect”触发器,将所选项目图像变为“ bull
1回复

具有对象作为图像的列表框

我想将我的对象从observablecollection形式显示为带有标签的图像。 对象包含名称和图像路径作为字符串。 我的问题是此图像不在解决方案中。 我创建了类似的东西,但是它显示对象成行且没有图像。 我想在框中显示它们。 我编辑了源代码:
3回复

检测列表框(WPF)中是否选择了某个项目

我想知道如何知道列表框的items数组中是否选择了某个项目。 列表框允许多个选择,因此我需要迭代所有这些选项,看看哪些是选中的,哪些不是。 非常感谢(我知道 - 短而甜)
1回复

在列表框中加载图像列表。WPF和MVVM

我正在尝试从ListBox的目录中显示一组图片。 当我选择另一个目录时,应该更新此ListBox。 以下代码无法正常工作,我也不知道为什么。 LoadImages()可以正常工作,因为_selectedImageList具有包含在所选目录中的元素,但是ListBox不显示任何内容。 X