2013-06-24 33 views
1

我正在使用FileToImageConverter來顯示基於文件擴展名的圖像。IValueConverter - FileImageConverter - 不顯示通用圖像

對於普通擴展名.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; 
     }  
    } 

這是打在try仍然

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

這是設置每個即使擴展名位於文件夾中,也存在使用!文件的默認圖像。傳遞中的樣子Test.doc的,test.docx,TEST.SQL,TEST.XLS等

當地人都呈現以下

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));   
      } 

的文件名:高亮紅色是它是什麼尋找媒體文件夾,但沒有一個,所以我試圖顯示默認圖像。

enter image description here

回答

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)); 
    } 
} 
+0

再次感謝Phil,!File.Exists現在讓它爲每個文件返回一個默認值。我認爲這是我設置這一行的方式var imageName = @「\ Media \ file_extension_」+ extension +「.png」; – KeyboardFriendly

+1

您可能需要在那裏有一個驅動器號「c:\ ...」。然後你的Uri可能需要成爲UriKind.Absolute。 – Phil

+0

謝謝,檢查,我添加了一些文件的圖像 – KeyboardFriendly

1

如果你看一下BitmapImage constructor documentation,你可以看到,它會拋出一個FileNotFoundException如果由uriSource參數指定的文件未找到。

因此,您應該捕獲此異常並返回您的通用圖像。

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 
}