如何更改其他班级

时间:2015-07-15 21:51:42

标签: c# winforms oop

我为某些软件构建了安装程序脚本。我试图对我的安装脚本(InstallationScript.cs)和Form GUI(Install.cs)进行分区。但是,当我尝试从InstallationScript类更新表单组件时,它cannot resolve symbol,但却可以看到.Show()之类的方法。我想也许如果我公开自己的公开引用,它将能够看到表单的实例,但这似乎也不起作用。我在这里错过了什么吗?

namespace Generic_Installer_Framework.gui {
    public partial class Install : Form {
       public static Install Self;

        public Install() {
            Self = this;
            InitializeComponent();
        }

        public void InstallStep(int value, string message, string logMessage = "") {
            Logger.Log(logMessage == "" ? message : logMessage);

            installationProgressBar.Value = value;
            installationRichTextBox.AppendText(message + "\n");
        }
    }
}  

其他课程:

namespace Generic_Installer_Framework{
    class InstallationScript {
        private readonly Form _installerForm = Install.Self;

        public void Start() {

            //This works
            _installerForm.Show();

            //This doesn't
            _installerForm.InstallStep(0, "Starting...");
        }
    }
}

非常感谢你!

2 个答案:

答案 0 :(得分:2)

  

但是,当我尝试从中更新表单组件时   在InstallationScript类中,它无法解析符号,但还可以看到   像.Show()。

这样的方法

问题就在这里:

private readonly Form _installerForm = Install.Self;

您已将“_installerForm”声明为Form的泛型类型,当然不知道您在说什么......

将类型更改为Install,一切都应该是好的:

private readonly Install _installerForm = Install.Self;

答案 1 :(得分:0)

我的猜测可能是因为你在另一个Thread中运行Start()方法。您可以尝试在委托中传递此方法:

public Action<int, string, string> InsStep = new Action<int, string, string>(InstallStep);

尝试在installerForm.InsStep(0, "Starting...", "");

的InstallationScript类中调用它

您还可以使用SynchronizationContext.Current属性: 首先,你从表单中取出它:

SynchronizationContext sync = SynchronizationContext.Current;

然后你将它传递给另一个线程或者你想要的东西,并使用如下:

sync.Post(delegate 
{
    // your updates here will be executed thread-safe
}, null);