如何从 Visual C# 2013 中的另一个(引用的)项目访问窗体组件
本文关键字:引用 项目 访问 组件 窗体 另一个 Visual 2013 | 更新日期: 2024-10-31 08:42:26
我正在尝试从Visual Studio Community 2013中的另一个"引擎"项目更改"游戏"项目中RichTextBox中的文本,该项目已被"游戏"项目引用。我尝试访问它的所有内容都没有通过智能感知调出 RichTextBox,导致红线,并且"引擎"项目拒绝构建。
通过检查网站和谷歌,我尝试使RichTextBox静态和其他一些技巧,包括我自己想出的一个技巧 - 制作第三个项目并引用其他两个项目。一切都无济于事。
这应该是我现在拥有的代码的重要部分:
在 Game.cs 中,我公开了班级:
namespace Game
{
public partial class Game : Form
{
... //All the code for the form
}
}
在Game.Designer中.cs我有RichTextBox公共和静态:
namespace Game
{
partial class Game
{
... // All the other unimportant stuff
public static System.Windows.Forms.RichTextBox rtbMessages; //I've fixed the errors this caused in InitializeComponent() already
}
}
现在从我的"引擎"项目中,我将尝试这样的事情(简化,但它显示了我正在尝试做的事情):
using Game;
nameSpace Engine
{
public class Monster
{
... // Properties, Constructor, etc.
public static bool IsDead(string name, int currentHP)
if (currentHP <= 0)
{
Game.rtbMessages.Text += String.Format("You have killed {0}.{1}", name, Environment.NewLine);
return true;
}
return false;
}
}
}
我只学习了 C# 和面向对象编程 3 周,现在使用我能够在网上找到的基本教程,但从我所学到的知识来看,老实说,我不知道为什么这行不通。我尝试将"引擎"中的引用添加回"游戏",但是我收到一个错误,说这将创建一个循环依赖关系,因为"游戏"已经引用了"引擎"。
这可能吗?我开始怀疑了。
编辑:我错误地假设"项目"只是用于命名空间的名称VS。问题不在于它们位于不同的命名空间中,而在于不同的项目。因此三振出局。
依赖项(项目引用)只能是单向的。 事实上,正如您所发现的那样,VS 非常努力地让您无法创建循环引用。
通常,"游戏"项目将引用"引擎"项目。 反之则不然。 引擎永远不需要知道游戏项目中的类型。
如果引擎确实需要了解游戏类型,那么架构就有问题。 要么游戏类型实际上应该是引擎类型,要么编码到引擎中的功能是特定于游戏的,并且应该在游戏项目中。
在您的情况下,功能(更新 rtbMessages 控件)属于游戏项目。 因此,从游戏代码中,您应该执行以下操作:
if (Engine.Monster.IsDead("monster name", monster_hp)) {
Game.rtbMessages.Text += String.Format("You have killed {0}.{1}", name, Environment.NewLine);
}
并从Monster.IsDead
功能中删除rtbMessages
更新。
此外,我会考虑进行另一项更改。
你真的需要Monster.IsDead
是静态的吗? 想必你已经有了对怪物的参考。 Engine.Monster
类型的非静态IsDead
方法可能更有意义。 您甚至可以将其设置为Engine.Monster
类的只读属性。