2011-05-19 16 views
9

FileInfo türünde bir MediaFile özelliği sağlayan bir viewmodel sınıfım var ve özelliği bir MediaElement öğesinin Source özelliğine bağlamak istiyorum.MediaInfo öğesinin FileInfo'ya Bağlanması SourceInfo öğesinin

Sorun, MediaElement öğesinin Source özelliğinin bir Uri beklemesidir, ancak FileInfo sınıfının FullName özelliğine (bağlaçta tanımlı bir dönüştürücüde) erişememesinin, bunun bir SecurityException oluşturacağıdır.

Görüntülerde sorun yok, Görüntü denetiminin FileInfo örneğinin akışını kullanarak dönüştürücüde oluşturabileceğim bir ImageSource nesnesi beklemesine neden oluyor.

Bağlamı nasıl tanımlarım, böylece MediaElementim doğru kaynağı alır? Ya da MediaElement'te dönüştürücü için nasıl geçebilirim, böylece MediaElement üzerinde SetSource (Stream) öğesini çağırabilirim.

ViewModel:

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

Dönüştürücü:

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

Bağlar:

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

cevap

5

Are yükseltilmiş izinlerle tarayıcıdan çıkıyorsunuz? Aksi takdirde, yerel dosya sistemine erişiminiz olmaz ve bir güvenlik istisnası alırsınız. Yükseltilmiş izinler (Belgelerim, Resimlerim, vb.) Ile bile erişebildiğiniz dizinlerle sınırlı olacaksınız. Cevabınız için

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

Teşekkür:

yükseltilmiş izinlerle OOB'de varsayarsak, aşağıdaki gibi bir şey yapabilirsiniz. Uygulama In-Browser'ı çalıştırıyor, bu yüzden FullName'e erişim hiçbir seçenek olmayacak. – Jehof