如何从 Visual C# 2013 中的另一个(引用的)项目访问窗体组件



我正在尝试从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类的只读属性。

最新更新