嘿伙计们,我在 wpf 方面相当年轻,所以我需要一点帮助,这就是我想要做的。
我想创建一个自定义媒体元素,我希望能够加载视频并播放 15 秒到 1 分钟的视频,我希望能够根据用户设置在加载时动态设置它。我基本上将大量视频加载到列表视图控件中,并且我希望播放视频,但我试图通过仅播放视频的小预览来节省资源。
我调查过的事情
- 自定义控件 - 有点丢失
- 子类化
- 预构建控制
我只是真的不确定下一步该去哪里。我会非常感谢你能给我的任何帮助。
嘿伙计们,我在 wpf 方面相当年轻,所以我需要一点帮助,这就是我想要做的。
我想创建一个自定义媒体元素,我希望能够加载视频并播放 15 秒到 1 分钟的视频,我希望能够根据用户设置在加载时动态设置它。我基本上将大量视频加载到列表视图控件中,并且我希望播放视频,但我试图通过仅播放视频的小预览来节省资源。
我调查过的事情
我只是真的不确定下一步该去哪里。我会非常感谢你能给我的任何帮助。
鉴于您对要求的扩展意见,我建议您使用普通的 MediaElement,但为其分配一个视频的“预览”版本,该版本仅包含您要显示的片段并降低了分辨率,以减少负载占用.
因此,您的模型将具有两个属性,例如 PreviewUri 和 SourceUri。在 PreviewUri,您存储视频的“预览”版本;在 SourceUri,您存储“完整”版本。在您的 ListBox 或 ItemsControl 中,您将使用绑定到 PreviewUri 的 MediaElements。当用户进行选择时,您会将主 MediaElement 的 Source 设置为 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 属性。