将MediaElement的Source-Property绑定到FileInfo

时间:2011-05-19 08:23:17

标签: c# silverlight data-binding silverlight-4.0 mvvm

我有一个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}}/>

1 个答案:

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