Elemento de mídia personalizado wpf
-
20-09-2019 - |
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.
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.