winforms 从不同表单调用函数

wwtsj6pe  于 2022-12-27  发布在  其他
关注(0)|答案(3)|浏览(249)

我目前正在为我的课程项目制作一个Rythm游戏,我在实现BGM开/关按钮时遇到了麻烦。
下面是我的简化代码:

    • 表格一**
public partial class Form1 : Form
    {
    public SplashScreen()
        {
            InitializeComponent();
            
            string path= System.Reflection.Assembly.GetEntryAssembly().Location;
            axWindowsMediaPlayer1.settings.volume = 0;
            axWindowsMediaPlayer1.Ctlcontrols.stop();
            axWindowsMediaPlayer1.URL = path.Remove(path.Length - 44) + "\\assets\\main.wav";
        }
        
        
        void BGMoff()
        {
            axWindowsMediaPlayer1.settings.mute = true;
        }
        void BGMon()
        {
            axWindowsMediaPlayer1.settings.mute = false;
        }
        
        
        private void Form1_Load(object sender, EventArgs e)
        {
            Form2 main = new Form2();
            main.BGM_off += BGMoff;
            main.BGM_on += BGMon;
        }
    }
    • 表格二**
public partial class Form2 : Form
        
    {
        public delegate void ClickButton();
        public event ClickButton BGM_off;
        public event ClickButton BGM_on;
        
        bool BGM = true
        
        public void button4_Click_1(object sender, EventArgs e)
        {
            if (BGM)
            {
                button4.BackgroundImage = Properties.Resources.BGMoff;
                BGM = false;
                BGM_off?.Invoke();
            }
            else
            {
                button4.BackgroundImage = Properties.Resources.BGMon;
                BGM = true;
                BGM_on?.Invoke();

            }
        }
    }

这是根据Darin对this thread的评论做出的。我相信我正确地按照步骤访问了axWindowsMediaPlayer,但是我错了。

tag5nh1u

tag5nh1u1#

通过创建第二个窗体并将其保存在变量中,然后从该变量调用函数,可以轻松地调用另一个窗体的函数。

s4n0splo

s4n0splo2#

看起来您的问题是在Form1_Load的此行中:

Form2 main = new Form2();

main创建为局部变量。
在分配它并注册到事件之后,它就超出了作用域。
您可以将其改为Form1的成员变量:

public partial class Form1 : Form
{
    // ...
    Form2 main;
    // ...
}

这样,main的生存期将与您的Form1的生存期相关。
您在Form1_Load中的代码应为:

main = new Form2();       // NOTE: this is the member this.main
main.BGM_off += BGMoff;
main.BGM_on += BGMon;
ryoqjall

ryoqjall3#

经过数小时令人沮丧的代码实验,我意识到我的错误。
这是我甚至没有包括的代码的一部分,因为它与事件处理本身有点无关。
main.Show(this);是罪魁祸首。它是用来打开新表单的代码,也就是在菜单之间切换。我正在创建Form2的新对象form2,并转到那里,而不是我们注册事件的地方,因此事件返回null。并且无法执行函数。

相关问题