如何在控制台应用程序中的WPF MediaElement上播放视频

时间:2011-06-12 14:02:31

标签: .net wpf mediaelement

我有一个引用WPF dll的控制台应用程序。我实例化并尝试在MediaElement上播放视频,但它没有触发任何事件。这或许意味着它不播放视频。以下是我写的代码:

class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            var element = new MediaElement();
            element.BeginInit();
            element.Source = new Uri("Wildlife.wmv", UriKind.RelativeOrAbsolute);
            element.EndInit();
            element.LoadedBehavior = element.UnloadedBehavior = MediaState.Manual;
            element.MediaOpened += new RoutedEventHandler(MediaElement_MediaOpened);
            element.Play();
            Console.ReadLine();
        }

        static void MediaElement_MediaOpened(object sender, RoutedEventArgs e)
        {
            Console.WriteLine("Media opened");
        }
    }

我希望“媒体开放”可以写在控制台上。它在WPF应用程序中工作正常。我在这里做错了什么?

我正在使用WPF 4.0

编辑:请注意我对视频输出不感兴趣。我知道我可以实例化一个窗口并加载视频,但这不是我想要做的。我只想了解为什么这段代码不起作用?

注意:在WPF中如果我在Window_Load中执行相同的行集而不将wpf元素添加到可视树中;我确实把事件解雇了。它不是关于插入可视树的元素。还有其他需要我不确定那是什么。

2 个答案:

答案 0 :(得分:2)

The MediaElement control requires a Win32 message loop in order to perform its operations。如果没有它,它根本就行不通。默认情况下,您的控制台应用程序中不会有一个。

它在Window.Load事件中起作用的原因是因为有一个消息循环作为WPF应用程序的一部分运行。这与“视觉树的生根”无关。

这也是@mzabsky's solution in PowerShell works的原因,因为Window.ShowDialog方法将确保存在一个消息循环来处理Win32消息。

答案 1 :(得分:1)

This是一个如何直接从PowerShell控制台打开普通WPF窗口的教程。我认为使用C#代码的常规控制台的行为几乎相同。

有趣的是:

$window = New-Object Windows.Window

$window.Title = $window.Content = “Hello World.  Check out PowerShell and WPF Together.”

$window.SizeToContent = “WidthAndHeight”

$null = $window.ShowDialog()

你必须打开一个新窗口作为对话框(否则你必须以某种方式在单独的线程上运行它,我猜)。

如果你不想看到一个窗口,你可以尝试在ShowDialog调用之后隐藏它,但我认为你无论如何都不能使用它。