2013-12-11 44 views
1

我正在寻找在我的应用程序中打开/关闭音乐按钮。我用下面的代码在Form 1,这是我播放的音乐形式:从Form 1开始音乐并在Form 2中停止

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Media; 

namespace WWE2K14SaveEditor 
{ 
    public partial class Form1 : Form 
    { 
     Form2 frm2 = new Form2(); 
     public WMPLib.WindowsMediaPlayer wplayer = new WMPLib.WindowsMediaPlayer(); 

     public Form1() 
     { 
      InitializeComponent(); 
     } 


     private void Form1_Load(object sender, EventArgs e) 
     { 
      try 
      { 
       wplayer.URL = "music/main.mp3"; 
       wplayer.controls.play(); 
      } 
      catch { }  

     } 

我想要的音乐停止的时候我在Form 2按下一个按钮,我尝试下面的代码,但它似乎没有工作:

Form1 frm1 = new Form1(); 
frm1.wplayer.controls.stop(); 

(此代码在按钮单击事件中使用。)

这是一个Windows窗体应用程序。我正在使用WMPLib。 任何帮助将不胜感激,谢谢。

回答

0

使用

public static WMPLib.WindowsMediaPlayer wplayer = new WMPLib.WindowsMediaPlayer(); 

然后从窗体2与

Form1.wplayer.controls.stop(); 

目前你只是在你的窗体2实例化Form1的新实例调用它,这将有不同的wplayer实例比你已经开始了一个音乐。

+0

这样做,谢谢Janne! –

+0

另请注意,从现在开始,您的Windows窗体应用程序只有一个音乐播放器实例,请记住这一点。如果你需要多个,你需要解决不同的解决方案。 –

1

您正在创建Form1的第二个实例,它与播放音乐的实例无关。

您需要将正在播放音乐的Form1实例的参考传递给Form2,并通过该实例使其呼叫stop()

实际上,您还可以将WMPLib.WindowsMediaPlayer实例传递到Form2,因为它会阻止Form2必须知道有关Form1的任何信息。

例如

public Form2(WMPLib.WindowsMediaPlayer player) 
{ 
    // Assign player to a private member variable. 
    this.player = player; 
} 

然后创建一个使用new Form2(wplayer);你的第二个形式,并在您单击处理程序调用player.stop();

+0

我明白你在说什么,但是当我尝试这样做时,IDE不会将wplayer变量显示为一个建议。 Janne Matikainen的回答表明,我必须在我的wplayer声明之前添加static。哪个工作完成了!感谢你的回答。 编辑:只要阅读你的编辑,这是另一种方式来做到这一点。我发现Janne的方式更简单,但我绝对会记住这一点。谁知道?我可能不得不在某个时候使用它。再次感谢:) –

+0

@Raza是的,请注意,我的答案是将'wplayer'和'frm2'的初始化移动到'Form1'的构造函数。显然首先初始化'wplayer',然后将它传递给'Form2'。关于使用“public static”字段(或者就此而言,甚至只是“public”),我唯一要说的是它使代码非常容易纠结。通过您选择的解决方案,可以从*任意位置访问'wplayer'变量。我怀疑这对你来说这不是一个问题 - 我猜这只是你试验和学习,这很酷。请注意,这不是最佳做法。 –

+0

+1为唯一的答案(至今),呼吁关注这方面的最佳做法。 – groverboy

0
Form1 frm1 = new Form1(); 

这会创建一个新的窗体实例,它不会引用播放音乐的窗体。

您需要将对Form1的引用传递给Form2。一种策略可能是向Form2添加一个名为MusicForm的属性或类似的东西 - 然后当您创建form2时,您可以将引用传递给form1。

public partial class Form2 : Form 
    { 

     public Form1 MusicForm { get; set;} 
     ... 
     ... 

然后,你可以修改Form1中:

public partial class Form1 : Form 
    { 
     Form2 frm2 = new Form2(); 
     frm2.MusicForm = this; 

     public WMPLib.WindowsMediaPlayer wplayer = new WMPLib.WindowsMediaPlayer(); 

然后调用: this.MusicForm.wplayer.controls.stop();

当然,如果所有想传递给WindowsMediaPlayer的人都不需要传递整个表单,也可以将其作为属性传入。