2011-05-19 3 views
9

Mam klasę viewmodel, która udostępnia właściwość MediaFile typu FileInfo i chcę powiązać właściwość z właściwością Source obiektu MediaElement.Binding Źródło-Właściwość MediaElement do FileInfo

Problem polega na tym, że właściwość źródłowa MediaElement oczekuje Uri, ale nie mogę uzyskać dostępu do właściwości FullName (w konwerterze zdefiniowanym w powiązaniu) klasy FileInfo, ponieważ spowoduje to wzrost wyjątku SecurityException.

W przypadku obrazów nie ma problemu, ponieważ kontrolka obrazu oczekuje obiektu ImageSource, który można utworzyć w konwerterze za pomocą strumienia instancji FileInfo.

Jak zdefiniować powiązanie, aby mój MediaElement uzyskał właściwe źródło? Lub jak mogę przekazać MediaElement do konwertera, aby móc wywołać SetSource (Stream) na MediaElement.

ViewModel:

public class ViewModel { 
    // additional code omitted 
    public FileInfo MediaFile {get; set;} 
} 

Konwerter:

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

Wiązania:

<Image Source="{Binding MediaFile, Converter={StaticResource fileInfoToMediaConverter} }"/> 
    <MediaElement Source="{Binding MediaFile, Converter={StaticResource fileInfoToMediaConverter}}/> 

Odpowiedz

5

Czy kończy Ci się przeglądarka z podwyższonymi uprawnieniami? W przeciwnym razie nie będziesz mieć dostępu do lokalnego systemu plików i otrzymasz wyjątek bezpieczeństwa. Nadal będziesz ograniczony do katalogów, do których masz dostęp, nawet z podwyższonymi uprawnieniami (Moje dokumenty, Moje obrazy itp.).

zakładając, że jesteś OOB z podwyższonym poziomem uprawnień, można zrobić coś jak następuje:

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

Dzięki za odpowiedź. Aplikacja działa w przeglądarce, więc dostęp do FullName nie będzie możliwy. – Jehof