将 MediaElement 的 Source-Property 绑定到 FileInfo

本文关键字:FileInfo 绑定 Source-Property MediaElement | 更新日期: 2023-09-27 17:57:11

我有一个视图模型类,它提供了一个类型为FileInfo的属性MediaFile,我想将该属性绑定到MediaElement的Source属性。

问题是,MediaElement 的 Source 属性需要一个 Uri,但我无法访问 FileInfo 类的 FullName 属性(在绑定中定义的转换器中),因为这将引发安全异常。

对于图像没有问题,因为 Image 控件需要一个 ImageSource 对象,我可以使用 FileInfo 实例的流在转换器中创建该对象。

如何定义绑定,以便我的媒体元素获得正确的源?或者我如何将 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}}/>

将 MediaElement 的 Source-Property 绑定到 FileInfo

您是否用

完了具有提升权限的浏览器? 否则,您将无法访问本地文件系统,并且您将收到安全异常。即使具有提升的权限,您仍将仅限于有权访问的目录("我的文档"、"我的图片"等)。

假设你是具有提升权限的 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;
}