将MediaElement的Binding Source-Property绑定到FileInfo

9
我有一个ViewModel类,提供了一个类型为FileInfo的MediaFile属性,并且我想将该属性绑定到MediaElement的Source属性。问题是,MediaElement的Source属性需要一个Uri,但是在绑定中定义的转换器中,我无法访问FileInfo类的FullName属性,因为这会引发SecurityException异常。对于图片,没有问题,因为Image控件期望一个可以使用FileInfo实例流创建的ImageSource对象。如何定义绑定以便我的MediaElement获取正确的源?或如何将MediaElement传递到转换器中,以便可以调用MediaElement的SetSource(Stream)方法。 ViewModel:
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}}/>
1个回答

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

感谢您的回答。该应用程序正在浏览器中运行,因此访问FullName将不是一个选项。 - Jehof

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接