0

我正在寻找从另一个类控制我的 Windows 窗体对象的最佳方法。如果您的回答是“这不是您在 OOP 语言中的做法!”,请不要回答。请照顾我需要的东西:

我的 Windows 窗体中有一个不可见的进度条。如果我在我的 Windows 窗体上按下一个按钮,应该加载一个文件并且进度条应该执行一些步骤......由于文件加载操作非常复杂,我从一个自己的类加载它,该类用于某种类型的文件. 喜欢:

void TestButton_Click(object sender, EventArgs e)
{
MapFiles.ProcessFile()
}

现在在 ProcessFile 方法中,我想控制表单中的 ProgressBar。如果我将 ProgessBar 设为公开且静态,它会起作用。但这有一些委屈。您不能再控制表单设计器中的元素了。

如果我可以访问我的表单的实例对象,那将很容易。但我不知道如何初始化表单:

Application.Run(new Form1());

我不想在这里对继承做些什么,因为 MapFiles 与 Form1 没有任何关系......

是否有另一种/最好的方法来控制另一个类的这个 ProgressBar?

4

4 回答 4

1

为什么不将进度条的引用传递给您的ProcessFile方法:

MapFiles.ProcessFile(progressBar1);

然后您可以从您的班级访问它,例如:

ProcessFile(ProgressBar progressBar1)
{
    progressBar1.Value = 0;
}

注意:正如您所说,这可能不是最好的方法。但是你已经明确了你的具体要求,所以这是我的建议,让你的班级控制进度条

于 2013-10-04T15:23:37.863 回答
0

只要您的班级在同一个项目中,您就可以这样做:

public class Class1
{
    public void AccessForm() 
    {
       var thatForm = (Form1)Form.ActiveForm;

        var progressBar = thatForm.Controls.Cast<Control>().Where(a => a.Name =="progressBar1").FirstOrDefault();
        MessageBox.Show(progressBar.Name);

    }

}

我更新了我的答案,所以你不必公开任何控制

于 2013-10-04T15:46:08.617 回答
0

您可以使用Progress该类非常有效地处理此问题。

刚开始Progress在你的点击处理程序中定义一个对象,它指示如何更新进度;在这种情况下,通过更新进度条的值。

然后将该Progress实例*as anIProgress`instance* 传递给您的工作人员。

然后工作人员可以使用Report来指示进度。

private void button1_Click(object sender, EventArgs e)
{
    Progress<int> progress = new Progress<int>(
        percent => progressbar1.Value = percent);
    DoStuff(progress);
}

private void DoStuff(IProgress<int> progress)
{
    Task.Run(() =>
    {
        for (int i = 0; i < 100; i++)
        {
            progress.Report(i);
            Thread.Sleep(200); //placeholder for real work
        }
    });
}

最重要的是,Progress该类甚至捕获当前并在调用进度更改事件时使用它,因此即使您从其他线程SynchronizationContext调用,该事件也能够在 UI 线程中触发。Report

于 2013-10-04T16:37:44.087 回答
0

如果您不想四处传递对表单的引用,您可以做这样的事情。

public static class FormSharer
{
   public static YourFormClass Form {get; set;}
}

在您执行的表单加载事件中

FormSharer.Form = this;

并且从其他所有类中,您只需引用 FormSharer.Form

话虽如此,这样做并不是一个好主意。但话又说回来,你需要它,就是这样。

于 2013-10-04T15:31:44.847 回答