IValueConverter - FileImageConverter - 不显示通用图像

时间:2013-06-24 19:39:26

标签: c# wpf

我正在使用FileToImageConverter根据文件扩展名显示图片。

一切都适用于普通扩展.xlsx,.doc,.docx,因为我在Media文件夹中有该扩展名的图像,但如果文件名的扩展名不在项目的媒体文件夹中,那么图像正在显示。我想尝试为文件夹中没有扩展名的所有文件扩展名分配通用图像。

因此,如果文件是test.sql,则将类似file_extension_file.png的内容指定为通用图标。普通图标的存储方式与file_extension_xlsx.png

类似

这是原始转换器

public class ConvertFileImageConverter : IValueConverter
{
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value as string == string.Empty) return null;
            string file_extension = System.IO.Path.GetExtension(value.ToString());
            file_extension = file_extension.Replace(".", "");
            var file = @"/Media/file_extension_" + file_extension + ".png";
            ImageSource src = new BitmapImage(new Uri(file, UriKind.Relative));
            return src;
        }    
     }

这仍然是尝试

if (value as string == string.Empty) 
    return null;

string file_extension = System.IO.Path.GetExtension(value.ToString());
file_extension = file_extension.Replace(".", "");
var file = @"/Media/file_extension_" + file_extension + ".png";
var genericfile = @"/Media/file_extension_file.png";

try
{
    return new BitmapImage(new Uri(file, UriKind.Relative));
}
catch (FileNotFoundException exception)
{
    return new BitmapImage(new Uri(genericfile, UriKind.Relative));
}

更新:以下是一些图片等。

enter image description here

这是将所有内容设置为默认图像,即使扩展名在文件夹中,也存在!文件。

private static ImageSource DefaultImage = new BitmapImage(new Uri(@"/Media/file_extension_file.png", UriKind.Relative));

            public object Convert(object value, 
                                  Type targetType, object parameter, CultureInfo culture)
            {
                var filename = (string)value;

                if(string.IsNullOrWhiteSpace(filename))
                {
                    return DefaultImage;
                }

                var extension = Path.GetExtension(filename).Replace(".", string.Empty);

                var imageName = @"/Media/file_extension_" + extension + ".png";
                if (!File.Exists(imageName))
                {
                    return DefaultImage; 
                }
                return new BitmapImage(new Uri(imageName, UriKind.Relative));        
            }

传入的文件名看起来像test.doc,test.docx,test.sql,test.xls等。

本地人显示如下:突出显示的红色是它在媒体文件夹中查找的内容,但没有一个,所以我试图显示默认图像。

enter image description here

2 个答案:

答案 0 :(得分:1)

如果您查看BitmapImage constructor documentation,则可以看到如果找不到 uriSource 参数指定的文件,它将抛出FileNotFoundException

因此,您应该捕获此异常并返回您的通用图像。

E.g:

try
{
    return new BitmapImage(new Uri(file, UriKind.Relative));
}
catch (FileNotFoundException exception)
{
    // log exception etc.
    return new BitmapImage(new Uri(genericfile, UriKind.Relative));
}
catch (Exception exception)
{
    // handle other exceptions
}

答案 1 :(得分:1)

我会使用File.Exists检查您的文件是否存在,如果没有返回默认图像。类似的东西:

public class ConvertFileImageConverter : IValueConverter
{
    private static ImageSource DefaultImage = new BitmapImage(
            new Uri(@"/Media/file_extension_file.png", UriKind.Relative));

    public object Convert(object value, 
                          Type targetType, object parameter, CultureInfo culture)
    {
        var filename = (string)value;

        if(string.IsNullOrWhiteSpace(filename))
        {
            return null; // or return a default image
        }

        var extension = Path.GetExtension(filename).Replace(".", string.Empty);

        var imageName = @"\Media\file_extension_" + extension + ".png";

        if(!File.Exists(imageName))
        {
            return DefaultImage;
        }

        return new BitmapImage(new Uri(imageName, UriKind.Relative));
    }
}