2011-05-19 3 views
9

У меня есть класс viewmodel, который предоставляет свойство MediaFile типа FileInfo, и я хочу привязать свойство к свойству Source MediaElement.Binding Source-Свойство MediaElement для FileInfo

Проблема заключается в том, что свойство Source объекта MediaElement ожидает Uri, но я не могу получить доступ к свойству FullName (в конвертере, определенном в привязке) класса FileInfo, потому что это приведет к возникновению исключения SecurityException.

С изображениями нет проблем, потому что управление Image ожидает объект ImageSource, который я могу создать в конвертере, используя поток экземпляра FileInfo.

Как определить привязку, чтобы мой MediaElement получил правильный источник? Или как я могу передать MediaElement в конвертер, чтобы я мог вызвать SetSource (Stream) на MediaElement.

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

ответ

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

Смежные вопросы