Vinculando origem-propriedade de MediaElement para FileInfo

9

Eu tenho uma classe viewmodel que fornece uma propriedade MediaFile do tipo FileInfo e eu quero vincular a propriedade à propriedade Source de um MediaElement.

O problema é que, a propriedade Source do MediaElement espera um Uri, mas eu não consigo acessar a propriedade FullName (em um conversor definido na ligação) da classe FileInfo, porque isso aumentará uma SecurityException. / p>

Com as imagens não há problema, pois o controle Image espera um objeto ImageSource que eu possa criar no conversor usando o fluxo da instância FileInfo.

Como posso definir a ligação, para que meu MediaElement receba a fonte correta? Ou como posso passar o MediaElement para o conversor para que eu possa chamar SetSource (Stream) no MediaElement.

O ViewModel:

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

O conversor:

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

As ligações:

    <Image Source="{Binding MediaFile, Converter={StaticResource fileInfoToMediaConverter} }"/>
    <MediaElement Source="{Binding MediaFile, Converter={StaticResource fileInfoToMediaConverter}}/>
    
por Jehof 19.05.2011 в 10:23
fonte

1 resposta

5

Você está ficando sem navegador com permissões elevadas? Caso contrário, você não terá acesso ao sistema de arquivos local e receberá uma exceção de segurança. Você ainda estará limitado aos diretórios aos quais você tem acesso, mesmo com permissões elevadas (Meus Documentos, Minhas Imagens, etc.).

Supondo que você é OOB com permissões elevadas, você pode fazer algo como o seguinte:

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;
}
    
por Matthew Keelan 22.05.2011 / 01:40
fonte