我有一个引用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元素添加到可视树中;我确实把事件解雇了。它不是关于插入可视树的元素。还有其他需要我不确定那是什么。
答案 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调用之后隐藏它,但我认为你无论如何都不能使用它。