2011-05-19 73 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