1

我希望在我的应用程序中制作一个“音乐开/关”按钮。我在 中使用以下代码Form 1,这是我播放音乐的形式:

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. 任何帮助将不胜感激,谢谢。

4

3 回答 3

1

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

您需要传递对Form1正在播放音乐的实例的引用Form2,并让它stop()通过该实例调用。

实际上,您也可以将WMPLib.WindowsMediaPlayer实例传递给Form2,因为它可以避免Form2Form1.

例如

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

然后使用创建您的第二个表单new Form2(wplayer);,并调用player.stop();您的点击处理程序。

于 2013-12-11T07:39:24.490 回答
0

利用

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

然后从 Form2 调用它

Form1.wplayer.controls.stop();

目前,您只是在 Form2 中实例化 Form1 的新实例,该实例将具有与您开始播放音乐的 wplayer 实例不同的 wplayer 实例。

于 2013-12-11T07:38:26.600 回答
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,则不需要传递整个表单 - 您也可以将其作为属性传入。

于 2013-12-11T07:41:12.627 回答