Учитывая ваши комментарии, расширяющие требование, я бы посоветовал вам использовать обычный MediaElement, но назначить ему «предварительную» версию видео, которая включает только фрагмент, который вы хотите показать, и имеет уменьшенное разрешение, чтобы сохранить загрузить след вниз.
Таким образом, ваша модель будет иметь два свойства, скажем PreviewUri и SourceUri. В PreviewUri вы сохраняете «предварительную» версию видео; в SourceUri вы храните «полную» версию. В вашем ListBox или ItemsControl вы будете использовать MediaElements, привязанные к PreviewUri. Когда пользователь делает выбор, вы устанавливаете Source из основного MediaElement в SourceUri. Таким образом, ваш ListBox будет выглядеть примерно так:
<ListBox ItemsSource="{Binding}">
<ListBox.ItemTemplate>
<DataTemplate>
<MediaElement Source="{Binding PreviewUri}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Ваша модель будет выглядеть примерно так:
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;
*/
}
}
и ваш код будет выглядеть примерно так:
DataContext = Video.LoadVideoInfo();
Способ отображения полноразмерного видео будет зависеть от того, что вы хотите запустить, и от того, где отображается полноразмерное видео. Использование ListBox вместо зацикливания и добавления дочерних элементов в StackPanel может помочь в этом, поскольку вы можете использовать событие SelectedItemChanged, привязку данных к SelectedItem или использовать свойство IsSynchronizedWithCurrentItem.