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

时间:2015-03-07 11:32:10

标签: c# winforms reference namespaces

我试图在我的" Game"中更改RichTextBox中的文本。来自另一个" Engine"在Visual Studio社区2013中的项目,已经被" Game"项目。我尝试访问它的所有内容都没有通过Intellisense显示RichTextBox,导致红线,以及"引擎"项目拒绝建设。

通过检查网站和Google,我尝试使RichTextBox保持静态和其他一些技巧,包括我自己想出的一个 - 制作第三个项目并参考其他两个。一切都没有用。

这应该是我现在拥有的代码的重要部分:

在Game.cs中,我有公开课:

namespace Game
{
    public partial class Game : Form
    {
        ...  //All the code for the form
    }
}
在Game.Designer.cs中的

我有RichTextBox public和static:

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周了,但是从我所学到的,我老老实实地不会这样做。知道为什么这不起作用。我尝试添加来自&#34; Engine&#34;回到&#34;游戏&#34;,但我得到一个错误,说这将创建一个循环依赖,因为&#34;游戏&#34;已引用&#34;引擎&#34;。

这甚至可能吗?我开始怀疑了。

编辑:我错误地假设&#34; Project&#34;只是VS用于命名空间的名称。问题不在于他们在不同的名称空间中,而是在不同的项目中。因此,三振出局。

1 个答案:

答案 0 :(得分:2)

Dependancies(项目引用)应该只是单向的。事实上,VS非常努力地让你无法创建循环引用,正如你已经发现的那样。

通常,&#34;游戏&#34;项目将参考&#34;引擎&#34;项目。不是相反。引擎永远不需要知道游戏项目中的类型。

如果引擎 需要了解游戏类型,那么架构就会出现问题。游戏类型实际上应该是引擎类型,或者您在引擎中编码的功能是游戏特定的,应该在游戏项目中。

在您的情况下,功能(更新rtbMessages控件)属于游戏项目。所以从游戏代码中你应该做这样的事情:

if (Engine.Monster.IsDead("monster name", monster_hp)) {
    Game.rtbMessages.Text += String.Format("You have killed {0}.{1}", name, Environment.NewLine);
}

并从rtbMessages功能中删除Monster.IsDead更新。

此外,我会考虑再做一次改变 你真的需要Monster.IsDead是静态的吗?想必你已经提到了怪物。 IsDead类型上的非静态Engine.Monster方法可能更有意义。您甚至可以将其设为Engine.Monster类的只读属性。