【发布时间】:2015-08-13 17:50:52
【问题描述】:
我正在开发一个项目,该项目旨在通过 WPF 窗口通过 MediaElement 播放音频和视频文件。这是窗口的 xaml:
<Window x:Class="HomeSystem_CSharp.MediaWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MediaWindow" MinHeight="480" MinWidth="720" WindowStyle="None" ResizeMode="NoResize" Visibility="Visible" Cursor="None">
<Grid Background="Black">
<MediaElement LoadedBehavior="Manual" HorizontalAlignment="Stretch" Name="video" VerticalAlignment="Stretch" Cursor="None" MinHeight="480" MinWidth="720"/>
</Grid>
</Window>
这将创建一个没有边框的窗口,我计划在未来全屏显示。不过现在,我希望桌面上有更多空间。这是我控制 MediaElement 的代码:
private bool playing = false;
public MediaWindow(string dir)
{
InitializeComponent();
video.Source = new Uri(dir);
play();
}
public void play()
{
if (playing)
return;
if (!this.IsVisible)
this.Show();
video.Play();
playing = true;
}
这个 MediaWindow 是在对象之外创建的,只需一个简单的MediaWindow mw = new MediaWindow("C:\\test.mp4");
无论我如何在代码中移动内容,每次启动时 GUI 都没有响应,但会播放声音。我可以在背景中听到视频,但我的屏幕上有一个破碎的窗口。只是一个黑匣子。
最大的问题是前几天它工作正常,突然坏了,我不知道发生了什么。我对 c# 有点陌生,所以我对正在发生的事情一无所知,但我已经使用 java 工作了几年,所以我并不完全是新手。谁能指出我做错了什么?我可以提供任何其他细节,但我认为我得到了回答所需的一切。感谢您的帮助,这一直困扰着我一整天都没有解决!
编辑:结果是,如果我使用
public void play()
{
if (playing)
return;
//if (!this.IsVisible)
// this.Show();
video.Play();
new Application().Run(this);
playing = true;
}
相反,它将运行 GUI。但是,这会挂断控制台。最初我使用 this.Show() 解决了这个问题,但现在这不起作用。我知道将整个项目移动到 WPF 项目中可以解决这个问题,但是我真的不想因为其他原因而这样做。暂时只有win32。任何想法为什么会发生这种情况以及如何解决它?如果有影响的话,我的主要功能上确实有[STAThread]。
编辑 2:
我正在播放的这个视频文件是电影长度,并且可以在任何其他软件中完美运行,以防止这成为开发问题。至于MediaWindow的创建。我所做的是制作了一个 win32 控制台项目并在那里设置用户命令。然后我创建了一个新的 WPF 项目,并创建了一个 xaml gui 窗口。我把这些代码文件复制到 win32 项目中,然后用MediaWindow mw = new MediaWindow("C:\\test.mp4"); 调用它以在 main 方法中启动我这样做是因为现在我试图避免使用纯 WPF 应用程序,而且因为我对 C# 有点陌生,所以我不确定如何在没有复制粘贴方法的情况下创建我想要的窗口。
【问题讨论】:
-
视频能否在您的系统上流畅播放,例如在 Windows Media Player 中?另外,我认为您需要添加更多关于这一切的详细信息。什么代码正在创建您的 MediaWindow?
-
@MikeFulton 查看我的第二次编辑。这有帮助吗?
-
我不确定“纯 WPF 应用程序”的概念是否像您想象的那样适用。当您使用 WPF 模板在 Visual Studio 中创建新项目时,它会创建一个默认窗口和一个打开它的 Application 类,并将所有适当的引用添加到 WPF 程序集。为方便起见,它是自动化的。听起来您所做的主要是绕过自动化,并可能使用 Application 类。您是在创建 Application 类还是直接从程序的 main() 函数打开 MediaWindow?
-
我直接从 main() 打开我的
MediaWindow。至于“纯 WPF”,我的意思不是整个项目都使用 GUI,而是使用控制台,并使用 GUI 来补充它。 -
我不知道您所说的“我使用控制台”是什么意思。你的意思是控制台模式的应用程序?例如,在某些时候,用户输入了一个命令,提示您打开一个窗口来播放视频,然后您返回控制台?
标签: c# wpf user-interface video freeze