C# 如何在两个窗体之间共享整数声明?
我目前正在WFA的c#中制作一些基本的增量游戏。代码如下:C# 如何在两个窗体之间共享整数声明?,c#,winforms,C#,Winforms,我目前正在WFA的c#中制作一些基本的增量游戏。代码如下: namespace Xadrs { public partial class Form1 : Form { public void Ref() { label2.Text = Points.ToString(); button2.Text = "Level up! (" + Upgradeprice.ToString() + ")"; label4.Text = Upg
namespace Xadrs
{
public partial class Form1 : Form
{
public void Ref()
{
label2.Text = Points.ToString();
button2.Text = "Level up! (" + Upgradeprice.ToString() + ")";
label4.Text = Upgrade.ToString();
label6.Text = Upgradeautoclick.ToString();
button4.Text = "Level up PPS! (" + Upgradeautoclickprice.ToString() + ")";
}
public int ach_beginner = 0;
public int ach_intermediate = 0;
public int ach_expert = 0;
public int ach_master = 0;
int Points = 0;
int Upgrade = 1;
int Upgradeautoclick = 0 ;
int Upgradeautoclickprice = 110;
int Upgradeprice = 25;
public Form1()
{
InitializeComponent();
Ref();
}
private void timer1_Tick(object sender, EventArgs e)
{
if (Upgrade == 5)
{
Points++;
Ref();
}
}
private void button1_Click(object sender, EventArgs e)
{
Points += Upgrade;
Ref();
}
private void button2_Click(object sender, EventArgs e)
{
if (Points >= Upgradeprice)
{
Upgrade += 1;
Points -= Upgradeprice;
Upgradeprice += Upgradeprice / 4;
}
else
{
MessageBox.Show("Not Enough Nico points...");
}
Ref();
if (Upgrade == 5)
{
MessageBox.Show("Beginner: Reach 5 PPS.\nReward: AutoClick!", "ACHIEVEMENT UNLOCKED!");
ach_beginner = 1;
timer1.Enabled = true;
Upgradeautoclick = 1;
button4.Visible = true;
Ref();
}
}
Form2 achievements = new Form2();
private void button3_Click(object sender, EventArgs e)
{
Form2.Show();
}
private void button4_Click(object sender, EventArgs e)
{
if (Points >= Upgradeautoclickprice)
timer1.Interval = timer1.Interval / 2;
Points -= Upgradeautoclickprice;
Upgradeautoclickprice += Upgradeautoclickprice;
}
在表格2中,我想要:
if (ach_beginner = 1)
{
//Text in this label = something like: Beginner - Reach 5 Points per click
labelwithachievement.Visible = true;
}
但是
ach\u初学者
没有在form2
中声明。我想以某种方式“连接”这个整数,使其声明来自form1
中的form2
您只需要一个参数。您可以调用Form2.Show
方法。与任何其他方法一样,形式2的方法可以成为参数。因此,在表格2中,您可以执行以下操作:
public void Show(int ach_beginner)
{
//Do sth. with your int
this.Show();
}
如果现在在Form1上调用Form2,则可以传递整数:
private void button3_Click(object sender, EventArgs e)
{
Form2.Show(ach_beginner);
}
我认为这是最简单的方法。您也可以创建一个属性,而不是重写Show方法。在表格2中声明:
public int AchBeginner {get;set;}
在Form1中,在调用Show方法之前设置此值:
private void button3_Click(object sender, EventArgs e)
{
Form2.AchBeginner = ach_beginner;
Form2.Show();
}
正如David在评论中解释的,该值不会在Form2上更新。如果要实现这一点,可以使用以下接口:
public interface IBeginner
{
int AchBeginner{get;set;}
}
public void Form1 : Form, IBeginner
{
public int AchBeginner{get;set;}
//The place you create Form2
Form2.Beginner = this;
}
public void Form2 : Form
{
public IBeginner Beginner{get;set;}
//Here you can access
int achBeginner = Beginner.AchBeginner:
}
更新
根据问题作者的评论,我认为事件是最有用的想法。所以你可以告诉你的Form2你在Form1上的角色达到了5级。例如:
public class LevelEventArgs : EventArgs
{
public int Level {get;}
public LevelEventArgs(int level)
{
Level = level;
}
}
//Form1 need to implement an Event which later can notify any subscriber (Form2 in this case)
public class Form1 : Form
{
public event EventHandler<LevelEventArgs> LevelUp;
//When your character reach new level do following:
LevelUp?.Invoke(this, new LevelEventArgs(ach_beginner));
//Show Form2
Form2 form = new Form2(this);
form.Show();
}
不要将其视为共享整数本身,而应将其视为
Form2
依赖于Form1
中的某些内容
由于变量当前是公共的(我们将在一分钟内讨论),因此最简单的方法就是提供Form2
,并引用Form1
的实例。将属性置于Form2
上,并在其构造函数中要求一个值:
private Form1 form1Instance;
public Form2(Form1 form1)
{
this.form1Instance = form1;
}
然后,在创建Form2
的实例时,将对Form1
的当前实例的引用传递给它:
Form2 achievements = new Form2(this);
if (this.form1Instance.ach_beginner == 1)
然后在Form2
中,您可以引用其新成员变量以从Form1
获取信息:
Form2 achievements = new Form2(this);
if (this.form1Instance.ach_beginner == 1)
关于公共变量的注释。。。通常认为公开属性而不是变量是最佳实践。因此,请将其替换为:
public int ach_beginner = 0;
为此:
public int Ach_Beginner { get; set; }
并相应地更新对它的引用。这有多种原因,但最终的想法是类应该隐藏其值并提供对它们的访问,而不仅仅是提供值本身
这是为对象提供依赖关系的一个非常简单的开始,您可以从这里开始做很多事情。例如,如果不希望将整个表单作为依赖项传递(因为它们包含的数据/功能比依赖项所需的数据/功能多得多),则可以将值封装在它们自己的对象中,并将该对象作为依赖项传递 由此推断,您可以继续将业务逻辑与UI元素(如表单和控件)分离,并开始将逻辑移动到这些业务逻辑对象和组件中。这将使您的逻辑更易于移植到其他UI平台上,更易于测试,等等 例如,假设您有一个类,例如:
public class LevelInfo // guessing on an appropriate name here
{
public int Ach_Beginner { get; set; }
public int Ach_Intermediate { get; set; }
public int Ach_Expert { get; set; }
public int Ach_Master { get; set; }
}
然后在Form1
中使用该对象:
private LevelInfo levelInfo = new LevelInfo();
// elsewhere...
levelInfo.Ach_Beginner = 1;
// etc.
然后Form2
可能需要引用该对象:
if (this.levelInfo.Ach_Beginner == 1)
并使用该对象:
if (this.levelInfo.Ach_Beginner == 1)
此时,
LevelInfo
与UI分离,可以包含可移植的业务逻辑/信息。这是通过值传递的。如果Form1
上的值发生变化,它将不会在Form2
的实例上更新@David,为什么在这种情况下会出现问题?@Servy:我不知道,因为我不完全知道该应用程序是如何使用的,但这可能是一个问题,当然值得注意。@David他对更新此值一无所知。所以我想这是可行的。如果该值变为更新,他将需要ref或events,您是对的。@David当您启动我的项目时,级别(int)为1,成就窗口(Form2)为空。在本例中,ach_初学者=0。当你达到第5级时,form1中的ach_初学者将值更改为1。现在,我需要更改表单2中标签的可见性。这就是我的意思。你的解决方案与你自己的解释相反。您已经声明了依赖于这一个值,但是您已经公开了一个完整的表单,充满了各种各样的行为,根本没有依赖性。因此,既然您意识到您提出的解决方案实际上不是一个好的解决方案,为什么要提出它?为什么不建议一个好的解决方案呢?我认为在这种情况下,接口是最好的解决方案。你说的“共享声明”是什么意思?