2011-05-19 71 views
9

我有一個viewmodel類,它提供FileInfo類型的MediaFile屬性,並且我想將該屬性綁定到MediaElement的Source屬性。將MediaElement的屬性綁定到FileInfo

問題是,MediaElement的Source屬性需要Uri,但我無法訪問FileInfo類的FullName屬性(在綁定中定義的轉換器中),因此會引發SecurityException。

圖像沒有問題,導致圖像控件需要一個ImageSource對象,我可以使用FileInfo實例的流在轉換器中創建該對象。

如何定義綁定,以便我的MediaElement獲取正確的源代碼?或者,如何將MediaElement傳遞給轉換器,以便我可以在MediaElement上調用SetSource(Stream)。

視圖模型:

public class ViewModel { 
    // additional code omitted 
    public FileInfo MediaFile {get; set;} 
} 

轉換器:

public class FileInfoToMediaConverter : IValueConverter { 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { 
     var file = value as System.IO.FileInfo; 
     if (MediaResourceFactory.IsImage(file.Extension)) { 
      System.Windows.Media.Imaging.BitmapImage image = new System.Windows.Media.Imaging.BitmapImage(); 
      image.SetSource(file.OpenRead()); 
      return image; 
     } 
     else if (MediaResourceFactory.IsVideo(file.Extension)) { 
      // create source for MediaElement 
     } 
     return null; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { 
     throw new NotImplementedException(); 
    } 
} 

的綁定:

<Image Source="{Binding MediaFile, Converter={StaticResource fileInfoToMediaConverter} }"/> 
    <MediaElement Source="{Binding MediaFile, Converter={StaticResource fileInfoToMediaConverter}}/> 

回答

5

是您使用提升的權限用完了瀏覽器?否則,您將無法訪問本地文件系統,並且您將收到安全異常。即使使用提升的權限(我的文檔,我的圖片等),您仍然僅限於您可以訪問的目錄。

假設你是OOB提升的權限,你可以做類似如下:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
{ 
    var file = value as System.IO.FileInfo; 
    if (MediaResourceFactory.IsImage(file.Extension)) { 
     System.Windows.Media.Imaging.BitmapImage image = new System.Windows.Media.Imaging.BitmapImage(); 
     image.SetSource(file.OpenRead()); 
     return image; 
    } 
    else if (MediaResourceFactory.IsVideo(file.Extension)) { 
     // create source for MediaElement 
     return new Uri(file.FullName).AbsoluteUri; 
    } 
    return null; 
} 
+0

謝謝您的回答。該應用程序正在運行In-Browser,因此訪問FullName將無法選擇。 – Jehof 2011-05-23 06:16:32