Pergunta

Ei pessoal, sou bastante verde quando se trata de WPF, então preciso de uma pequena ajuda, aqui está o que estou procurando fazer.

Quero criar um elemento de mídia personalizado, quero carregar um vídeo e reproduzir qualquer lugar de 15 segundos a 1 minuto do vídeo, quero poder defini -lo dinamicamente em carregamento com base nas configurações do usuário. Estou carregando toneladas de vídeos essencialmente em um controle de visualização de lista e quero que o vídeo seja reproduzido, mas estou tentando economizar recursos reproduzindo apenas uma pequena prévia do vídeo.

Coisas que eu olhei para

  • Controle personalizado - um pouco perdido
  • subclasse
  • controle pré -construção

Estou realmente inseguro sobre para onde ir a seguir. Eu apiciaria muito qualquer ajuda que você possa me dar.

Foi útil?

Solução

Dados seus comentários que se expandem sobre o requisito, eu sugiro que você use o mediarelement normal, mas atribuindo -lhe uma versão de "visualização" do vídeo que inclui apenas o fragmento que você deseja mostrar e reduziu a resolução, de modo a manter a pegada de carga baixa .

Assim, seu modelo terá duas propriedades, digamos Previewuri e Sourceuri. Na pré -visualização, você armazena a versão "visualização" do vídeo; No Sourceuri, você armazena a versão "completa". Na sua caixa de lista ou itemsControl, você usará medialements vinculados ao visualizador. Quando o usuário fizer uma seleção, você definirá a fonte do mediarelement principal para o Sourceuri. Então, sua caixa de listagem ficará assim:

<ListBox ItemsSource="{Binding}">
  <ListBox.ItemTemplate>
    <DataTemplate>
      <MediaElement Source="{Binding PreviewUri}" />
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

Seu modelo ficará parecido com isto:

public class Video  // ideally implement INotifyPropertyChanged - not shown
{
  public Uri PreviewUri { get; set; }
  public Uri SourceUri { get; set; }

  public static ObservableCollection<Video> LoadVideoInfo()
  {
    /* pseudocode
    new up a collection
    foreach (file in videoFolder)
      collection.Add(new Video { PreviewUri = smallFileUri, SourceUri = bigFileUri });
    return collection;
    */
  }
}

E seu código por trás será algo assim:

DataContext = Video.LoadVideoInfo();

Como você mostra o vídeo em tamanho real dependerá do que você deseja acionar isso e para onde o vídeo de tamanho completo é exibido. Usar uma caixa de listagem em vez de loop e adicionar crianças a um Stackpanel pode ajudar com isso, pois você pode usar o evento selecionado, o banco de dados para selecionar ou usar a propriedade ISSynchronizedWithCurrentItEm.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top