【问题标题】:How to create LibVLCSharp custom playback controls in Xamarin Forms?如何在 Xamarin Forms 中创建 LibVLCSharp 自定义播放控件?
【发布时间】:2020-04-15 22:18:26
【问题描述】:

我一直在寻找关于如何为 LibVLCSharp 创建自定义播放控件的指南,似乎每个人都在谈论,但我从未找到过该指南。

我只是想为底部播放控制面板创建带有事件处理程序的其他按钮,我尝试了这个,但在进入中断模式时在启动时抛出 System.NullReferenceException 异常...

<vlc:MediaPlayerElement MediaPlayer="{Binding MediaPlayer}" LibVLC="{Binding LibVLC}">
    <vlc:MediaPlayerElement.PlaybackControls>
        <vlc:PlaybackControls>
            <vlc:PlaybackControls.ControlTemplate>
                <ControlTemplate>
                    <Grid>
                        <StackLayout Orientation="Horizontal" HorizontalOptions="CenterAndExpand">
                            <Button Grid.Column="0" Text="Test 1"/>
                            <Button Grid.Column="1" Text="Test 1"/>
                            <Button Grid.Column="2" Text="Test 1"/>
                        </StackLayout>
                    </Grid>
                </ControlTemplate>
            </vlc:PlaybackControls.ControlTemplate>
        </vlc:PlaybackControls>
    </vlc:MediaPlayerElement.PlaybackControls>
</vlc:MediaPlayerElement>

我希望它像原来的一样(自动隐藏、点击时覆盖等),但具有我自己的布局和控件。我还考虑过使用现有的并尝试覆盖他们的处理程序来实现我自己的代码并覆盖每个按钮的文本属性以更改其图标但没有找到任何帮助的运气。

提前致谢^_^

【问题讨论】:

  • “启动时抛出异常”——与其说这个模糊的描述,不如告诉哪个特定的异常被抛出了?
  • 抱歉,它进入了中断模式并出现 System.NullReferenceException...
  • 哪一行导致异常?哪个元素为空?
  • 我不知道,它进入了中断模式,我真的找不到哪一行导致了异常......
  • 查看堆栈跟踪。这是基本调试

标签: xamarin xamarin.forms custom-controls libvlcsharp


【解决方案1】:

你感兴趣的代码在这里:https://code.videolan.org/videolan/LibVLCSharp/-/blob/3.x/src/LibVLCSharp.Forms/Shared/Themes/Generic.xaml

我还考虑过使用现有的并尝试覆盖他们的处理程序来实现我自己的代码并覆盖每个按钮的文本属性以更改其图标

这就是我们要走的路。

上一个 SO 问题可能会回答您的问题:https://stackoverflow.com/a/14217500/4064749

只需创建一个新的Stylebased onPlaybackControlsStyle,覆盖你想要的,然后在PlaybackControls元素上设置它。

我最近创建了https://code.videolan.org/videolan/LibVLCSharp/-/issues/309 来跟踪自定义 MediaElement 教程的需求。

更多关于样式继承的文档:https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/styles/xaml/inheritance

【讨论】:

  • 我真的不明白你做了什么,我试图创建一个目标类型为TemplatedView 的快速事物样式,其中它的控制模板属性设置为带有红色背景的空stacklayout(只是使用虚拟元件进行测试)。我将播放控件样式设置为样式键,但没有任何效果,旧的播放控件就像我什么都不做一样显示出来......我错过了什么?!
  • 如果我将样式名称更改为您提供的样式名称以外的任何其他名称,也会发生同样的异常。我只是想解释一下我想创建整个播放控制面板的内容,我认为这是可能的,因为文档提到整个播放控制是可定制的......
【解决方案2】:

我终于找到了导致异常的问题,当我创建完全正确的自定义控件模板时,LibVLCSharp 开发人员背后的 MediaPlayerElement 代码本身无法找到具有已定义名称的元素,因为它们对按钮和视图使用硬编码名称而不是使用绑定和动态设置器。

因此,可以采取几种解决方法来解决此类问题,以下是我的一些想法:

  1. 使用通用样式documented here 并对其进行修改而不删除任何元素,而是将它们隐藏或覆盖它们。
  2. 使用与原始控件名称相同的控件创建您自己的样式。
  3. 找到一种方法来修改或创建一个全新的播放控制元素,使用原始元素可以找到 herehere

感谢mfkl 的回答,它帮助我了解了一切如何在幕后进行解释,尽管这花了我几天时间才弄清楚。

【讨论】:

  • 我们可以添加一个具有自定义功能的新按钮吗?
  • 你能再澄清一点吗?我通过 NuGet 获得了 libVLCSharp.Forms。我是否需要从他们的仓库(xamls、转换器等)中复制一堆文件来覆盖 PlaybackControlsStyle?
  • @AlamzaibFarooq 抱歉,直到今天我才看到您的评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-08
  • 1970-01-01
  • 2017-12-21
  • 2019-10-13
  • 2019-11-21
  • 2020-01-30
  • 2015-06-01
相关资源
最近更新 更多