MVVM应该用于WinForms吗?如果是这样,使用MVP的优势是什么?
我有一个C#桌面应用程序(CompositUI/WinForms).此应用程序使用SmartClient连接到Web服务.我的任务是使用SpecFlow和White框架为此应用程序引入(改进)测试.为了测试GUI,我需要模拟webservice调用.连接到它的类正在通过Spring.net注入.我的任务是测试能够在测试期间模拟webservice调用的应用程序,这意味着,我的测试代码需要控制我的模拟将执行的操作.问题:启动GUI的方法根本就是不将控制权返回给调用它的线程.结果,我们无法控制GUI和模拟.
所以我现在的问题是:
它是可行的(如果是这样 - 如何做)在单独的线程中启动GUI并控制回测试线程?
什么是运行GUI测试的其他可能性,这将允许我控制注入?
我有一个在 .NET Framework 4.0 上运行的 C# WinForms 应用程序。
当用户在一段时间内处于非活动状态时,我希望它隐藏所有显示的表单并在通知区域中显示一个图标。当用户单击该图标时,会出现一个登录表单,如果凭据有效,它将打开之前打开的表单。
为此,我将打开的表单列表存储在List对象中Form并隐藏它们,如下所示。该方法由Timer调用:
private void LogOut()
{
foreach (Form form in Application.OpenForms)
if (form.Visible)
{
GlobalVariables.formList.Add(form);
form.Hide();
}
}
Run Code Online (Sandbox Code Playgroud)
验证凭据后,我尝试使表单再次可见,如下所示:
//Show the previous forms.
foreach (Form form in GlobalVariables.formList)
form.Visible = true;
//Clear the forms list.
GlobalVariables.formList.Clear();
Run Code Online (Sandbox Code Playgroud)
如果我在隐藏表单时只打开 MainForm,则在重新登录时它会正常显示。如果我打开任何其他表单(从 MainForm 打开ShowDialog()),程序将崩溃form.Visible = true;并给出以下信息错误信息:
ObjectDisposedException was unhandled
Cannot access a disposed object
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?另一种实现我想要实现的目标的方法也很棒。
请注意,使用 try - catch 块来确定表单是否已被处理并重新启动表单不是一个选项,因为用户可能在隐藏表单中具有未保存的输入。
经过 3 个多小时的搜索,我无法在网上找到任何相关内容,因此我们将不胜感激!
编辑:在尝试了各种方法之后,我注意到问题只发生在我使用打开表单的表单上ShowDialog() …
我想更新Form1from的标签Form2.所以这就是我所拥有的:
// Form1
public string Label1
{
get { return this.label1.Text; }
set { this.label1.Text = value; }
}
// Form2
private void button1_Click(object sender, EventArgs e)
{
Form1 frm1 = new Form1();
frm1.Label1 = this.textBox1.Text;
this.Close();
}
Run Code Online (Sandbox Code Playgroud)
所以上面的代码不起作用.但是,当我添加以下内容时:
frm1.Show();
Run Code Online (Sandbox Code Playgroud)
后
this.Close();
Run Code Online (Sandbox Code Playgroud)
在Form2代码中,Form1显然是再次打开(两个窗口).但是我希望它在同一个窗口中更新,所以我认为this.Close()是不必要的.
有人有主意吗?