Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自定义媒体元素_C#_.net_Wpf_Mediaelement - Fatal编程技术网

C# 自定义媒体元素

C# 自定义媒体元素,c#,.net,wpf,mediaelement,C#,.net,Wpf,Mediaelement,嘿,伙计们,当涉及到wpf时,我是相当绿色的,所以我需要一些帮助,以下是我想要做的 我想创建一个自定义媒体元素,我想能够加载视频并在任何地方播放15秒到1分钟的视频,我想能够根据用户设置动态设置加载。我正在将大量视频加载到列表视图控件中,我希望视频能够播放,但我试图通过只播放视频的一小部分预览来节省资源 我调查过的事情 自定义控件-有些丢失 子类化 预构建控制 我真的不知道下一步该去哪里。如果您能提供任何帮助,我将不胜感激。鉴于您对该要求的评论不断扩大,我建议您使用普通的MediaEleme

嘿,伙计们,当涉及到wpf时,我是相当绿色的,所以我需要一些帮助,以下是我想要做的

我想创建一个自定义媒体元素,我想能够加载视频并在任何地方播放15秒到1分钟的视频,我想能够根据用户设置动态设置加载。我正在将大量视频加载到列表视图控件中,我希望视频能够播放,但我试图通过只播放视频的一小部分预览来节省资源

我调查过的事情

  • 自定义控件-有些丢失
  • 子类化
  • 预构建控制

我真的不知道下一步该去哪里。如果您能提供任何帮助,我将不胜感激。

鉴于您对该要求的评论不断扩大,我建议您使用普通的MediaElement,但为其分配一个视频的“预览”版本,该版本仅包含您想要显示的片段,并且分辨率降低,以减少加载占用空间

因此,您的模型将有两个属性,比如PreviewUri和SourceUri。在PreviewUri,您存储视频的“预览”版本;在SourceUri中,存储“完整”版本。在ListBox或ItemsControl中,您将使用绑定到PreviewUri的MediaElements。当用户做出选择时,您将主MediaElement的源设置为SourceUri。因此,您的列表框将如下所示:

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

如何显示全尺寸视频将取决于要触发的内容以及全尺寸视频的显示位置。使用列表框而不是循环并将子项添加到StackPanel可能会有所帮助,因为您可以使用SelectedItemChanged事件、databind to SelectedItem或使用IsSynchronizedWithCurrentItem属性。

是否尝试构建将下载预览视频的内容,您将处理一个事件,例如清除窗口,下载并播放完整视频?或者下载完整视频,但一开始只播放片段的东西(但有办法播放完整视频)?还是一些中间行为?可能有多种方法可以实现您想要的功能,但具体取决于您希望自定义元素的工作方式。我现在正在做的是在我的视频文件夹中循环,并将媒体元素添加到scrollviewer旁边的stackpanel中。所以我可以有大约5-20个视频,我正在尝试建立一个信息亭应用程序,所以视频的数量可能会有所不同。我最初的想法是让视频在15秒到1分钟之间循环播放。这样用户就可以知道它是视频而不是图片(我有一个单独的滚动查看器)。我真的在努力减少这个程序将消耗的资源,因为硬件会有所不同。尝试剪辑视频可能不是办法,Idk,可能更好的线程???那么mediaElement对象是否开始自己的线程?因为这是我关于改进播放的其他想法。对不起,我不知道它是如何在内部管理线程的。但是自己创建后台线程可能很棘手,因为您只能与拥有它们的线程中的UI元素交互。此外,WPF媒体类(MediaElement、MediaPlayer和MediaTimeline)仅公开Uri类型的源属性,因此,除了创建自定义Uri方案或其他内容外,如何加载自己异步加载的数据并不明显。