如何使用 LibVLCSharp 库阻止 Grid 控件内的 VideoView 控件打开新窗口?

问题描述

我使用 LibVLCSharp.WPF 使用 VideoView 控件播放视频。我在 viewmodel 中绑定了 MediaPlayer 和 Visibility。我可以让它播放视频,而不是嵌入它创建的网格控件中,并打开一个新窗口并在那里播放视频。我已经搜索过,发现存在空域问题,但可能是我做错了什么来阻止视频在网格内播放,就像您将图像放入图像控件中一样。

播放器位于 MainWindow 内的 UserControl 内。

XAML

<Grid>    
    <media:VideoView x:Name="MediaPlayer"
        VerticalAlignment="Center"
        HorizontalAlignment="Center"
        MediaPlayer="{Binding MyMediaPlayer}"
        Visibility="{Binding IsMediaPlayerVisible,Converter={StaticResource VisConverter}}"/>
</Grid>

视图模型

void StartVideo()
{
    IsMediaPlayerVisible = true;

    Core.Initialize();
    using (_libVLC = new LibVLC())
    {
        MyMediaPlayer = new MediaPlayer(_libVLC);
        MyMediaPlayer.Media = new Media(_libVLC,new Uri(@"path\to\media\file"));
        MyMediaPlayer.Play();
    }
}

我可以像网格中的图像控件一样嵌入 VideoView 吗?

解决方法

请始终分享一个完整的最小样本。您的 Q 缺少大部分代码。

当提供的窗口(例如此处的 VideoView)未准备好或未完全初始化时,LibVLC 将创建一个新的窗口。

根据经验,始终从官方 libvlcsharp 示例开始。 https://code.videolan.org/videolan/LibVLCSharp/-/blob/3.x/samples/LibVLCSharp.WPF.Sample/Controls.xaml.cs

public Controls(Example1 Parent)
{
    parent = Parent;

    InitializeComponent();

    // we need the VideoView to be fully loaded before setting a MediaPlayer on it.
    parent.VideoView.Loaded += VideoView_Loaded;
    PlayButton.Click += PlayButton_Click;
    StopButton.Click += StopButton_Click;
    Unloaded += Controls_Unloaded;
}

private void VideoView_Loaded(object sender,RoutedEventArgs e)
{
    _libVLC = new LibVLC(enableDebugLogs: true);
    _mediaPlayer = new MediaPlayer(_libVLC);

    parent.VideoView.MediaPlayer = _mediaPlayer;
}