我有一个viewmodel类,它提供FileInfo类型的属性MediaFile,我想将该属性绑定到MediaElement的Source属性。
问题是,MediaElement的Source属性需要一个Uri,但是我无法访问FileInfo类的FullName属性(在绑定中定义的转换器中),因为这会引发SecurityException。 / p>
使用图像没有问题,因为Image控件需要一个ImageSource对象,我可以使用FileInfo实例的流在转换器中创建。
如何定义绑定,以便我的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}}/>
答案 0 :(得分: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;
}