c# - 从另一个项目修改 Windows 窗体控件

标签 c# winforms

我在用户控件 MainScreen 中有一个控件 lblDate。我想在类 Date 中的方法中修改它,该类位于另一个项目 AoWLibrary 中。我无法引用它,因为 AoWLibrary 是第一个项目的依赖项。

我试图将 lblDate 设为静态,但编译器一直向我抛出错误,而且我有一个 Date 似乎无法访问的公共(public)属性:

    public Label LabelDate
    {
        get { return lblDate; }
        set { lblDate = value; }
    }

在 Date 类中,我需要公共(public)方法 CalculateDate 来修改 lblDate 的 Text 属性

    public static void CalculateDate()
    {
        GameDate = month.ToString() + "/" + displayDay.ToString() + "/" + year.ToString();

    // LabelDate.Text = GameDate;
    // This is essentially what I need to do
    }

此外,我什至无法在同一项目的其他控件中访问 lblDate。

最佳答案

因此,总体思路是您需要跟踪范围内的内容。有很多方法可以做您想做的事,但其中任何一种都依赖于以您可能尚未完全理解的方式正确引用彼此的对象。别担心 - 每个人都必须在某个时候解决这个问题。

当您尝试将该成员设为静态时,编译器会报错的原因是标签本身不是静态的。绑定(bind)到 MainScreen 的单个实例,它在静态上下文中没有任何意义,静态上下文根据定义是一个范围,没有任何对特定 MainForm 的固有引用。

当然,您的 Date 类也是一个完全不同的上下文,但它的非静态成员确实可以访问 Date 的实例。在您创建之前,这两个上下文之间没有任何路径。静态路由实际上会起作用(查找单例模式:这个想法是您静态存储类的第一个也是唯一一个实例并从其他地方引用它)但可能不是好的设计。其他方法是将 MainScreen 的实例(最好通过接口(interface))或什至是 LabelDate 本身传递给 Date。所有这些都可以让你需要的两个部分在一起说话。

但是,我想建议您考虑一下游戏状态的存储位置。它是在库中还是在消费程序集中?如果是前者,您可能需要考虑为需要在库类中存储和操作的数据创建一个完整的无 GUI 模型,并且只在主应用程序中按原样使用现成的数据。另一种选择是您的模型存在于主应用程序中,并在必要时回调您的库。在这种情况下,您现在应该坚持向图书馆寻求答案(或最多监听图书馆中的事件),而不是期望它自己返回到应用程序(无论是获取还是提供信息)。

在弄清楚如何做到这一点时,您可能会发现范围管理问题更容易处理。即使是一点点好的架构也能大有作为。

但如果这一切都让人难以抗拒,请不要过分强调。听起来你这样做是为了好玩,这是一种很好的学习方式。您会遇到这样的问题,并且要么找到一个好的设计,要么找到一个不太好的设计,但无论哪种方式,您都在与重要的概念作斗争,并且会为此做得更好。

关于c# - 从另一个项目修改 Windows 窗体控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16474342/

相关文章:

c# - 检查远程文件是否存在

c# - 澄清 IL 生成的引用字符串的代码

c# - 如何从 C# winform 正确关闭屏幕键盘进程?

C# listview 可点击的列和行

c# - GZipStream 正在切断 XML 的最后一部分

c# - 如何将这段代码重写为LINQ?

c# - 使用 Simple.Data 更新列表

c# - 如何检查 HTML 元素是否包含文本内容

c# - 当已经按下第二个键时如何检测键向下/向上

c# - 将位图转换为图标