我用C#制作游戏库。
我有一个主窗体,它有一个FlowLayoutPanel,它托管游戏库。有一个"添加游戏" main Form中的方法,它将一个项添加到FlowLayoutPanel,但是这个方法是从第二个表单调用的。但是,当我从第二种形式调用此方法时,根本没有任何事情发生,但如果从主窗体中调用它,它就可以工作。
以下是代码:
这里是mainForm中的添加游戏方法:
public void addIso()
{
PictureBox gameBox = new PictureBox();
gameBox.ImageLocation = "link here";
gameBox.Height = 200;
gameBox.Width = 150;
gameBox.SizeMode = PictureBoxSizeMode.StretchImage;
isoPanel.Controls.Add(gameBox);
}
此方法向FlowLayoutPanel添加一个名为isoPanel的占位符游戏。从同一表格调用时工作。
以下是从第二种形式调用该方法的方法:
private void addGameButton_Click(object sender, EventArgs e)
{
MainWindow mainForm = new MainWindow();
mainForm.addIso();
}
当我尝试在方法中添加简单的消息框时,消息框确实显示,但游戏没有添加到FlowLayoutPanel。
任何提示或解决方案?
我为我糟糕的英语和凌乱的编程术语道歉,我不久前开始学习C#。
答案 0 :(得分:0)
当您加载第二个表单时,您似乎正在重新创建表单。 因为这确实缺乏一点背景。
我建议你有一个主踏板,它将运行两种形式
创建一个游戏管理器类Ex:GameManager.cs
在类中为两个表单创建一个变量并将它们设置为protected。
在每个表格中发送游戏管理员的参考资料。
允许每个窗口通过管理器相互通信,提供安全的内部通信。
如果你想要一些消息来源,请告诉我。
答案 1 :(得分:0)
您可以使用
var headers = new Headers(); headers.append('Content-Type', 'application/json'); this.http.post('http://www.syntaxsuccess.com/poc-post/', JSON.stringify({firstName:'Joe',lastName:'Smith'}), {headers:headers}) .map((res: Response) => res.json()) .subscribe((res:Person) => this.postResponse = res);
和delegate
来实现此目的。
你在这里做错了什么:
从Delegate
点击事件,您正在创建mainForm的新实例。这不是您当前看到的实际主要表单,它是mainForm的不同实例。您的代码将控件添加到布局中,只需通过调用addGameButton
来确认这一点,这将打开一个带控件的新表单。
你能做什么:
在这种情况下,您想要修改父控件,在父类中调用方法,您需要通过以下方式使用委托:
需要在Parent类中应用更改,即。mainForm.Show()
。
定义委托和该委托类型的事件。
MainWindow
为Event分配所需的方法(最好在构造函数中使用它):
public delegate void UpdateUiDelegate();
public event UpdateUiDelegate UpdateUiEvent;
接下来的工作是儿童形式,即。public MainWindow ()
{
UpdateUiEvent+= new UpdateUiDelegate(addIso);
}
(使用更好的名称,让它成为Form2
)。在那里创建一个代表:
ImageChildControl
回到MainWindow,在创建子表单实例后找到你调用Second表单的地方,将创建的事件分配给实例的Delegate,为此使用以下代码:
public Delegate ControlCreator;
还有一项儿童形式的工作要做;从Button click事件中调用委托。即。,
ImageChildControl ImageChildControlInstance = new ImageChildControl();
ImageChildControlInstance.ControlCreator = UpdateUiEvent;
现在您可以看到您的代码按预期工作。