C# 在主窗体和弹出窗体之间切换
如何在子窗体处于活动状态时锁定(并使其看起来褪色)父窗体?我试图使子窗体位于最上面,但这只是使它始终可见,而且我仍然可以编辑父窗体。我希望在VS2012,C#中运行子窗体时无法对主窗体进行操作。这是我用来调用第二个表单的代码C# 在主窗体和弹出窗体之间切换,c#,.net,winforms,C#,.net,Winforms,如何在子窗体处于活动状态时锁定(并使其看起来褪色)父窗体?我试图使子窗体位于最上面,但这只是使它始终可见,而且我仍然可以编辑父窗体。我希望在VS2012,C#中运行子窗体时无法对主窗体进行操作。这是我用来调用第二个表单的代码 private void checkButton_Click(object sender, EventArgs e) { Form2 newForm = new Form2(this); newForm.Show(); } 只需为当前运行的表单添加Hide
private void checkButton_Click(object sender, EventArgs e)
{
Form2 newForm = new Form2(this);
newForm.Show();
}
只需为当前运行的表单添加Hide()
private void checkButton_Click(object sender, EventArgs e)
{
Form2 newForm = new Form2(this);
this.Hide();//hide old form
newForm.Show();
}
您可以使用Form.ShowDialog创建对话框,该对话框将在父窗体顶部打开,并且在关闭子窗体之前不允许编辑父窗体
private void checkButton_Click(object sender, EventArgs e)
{
Form2 newForm = new Form2(this);
newForm.ShowDialog(this);
}
一种非常简单的方法是在子窗体上使用
ShowDialog()
而不是Show()
。这将阻止与主窗体的任何交互。这也是一种传递结果的好方法。当然,还有很多其他的方法
例如:
private void checkButton_Click(object sender, EventArgs e)
{
Form2 newForm = new Form2(this);
newForm.ShowDialog();
}
有关更多详细信息,请参见MSDN:您可能希望在单独的线程中运行form2,并将topmost设置为true,form1将正常运行,但form2也将运行您希望取消阻止的任何内容。这是你想要的吗
namespace TestModal
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Thread thrd = new Thread(newwindow);
thrd.IsBackground = true;
thrd.Start();
}
private void newwindow()
{
Form2 frm2 = new Form2();
frm2.TopMost = true;
frm2.ShowDialog();
}
}
}
这个问题与VisualStudio有什么关系?在另一个编辑器中会有所不同吗?为什么它没有用Windowm、XAML或任何其他相关的标签进行标记?它只是为了清晰起见,这就是我正在使用的IDE,如果它如此麻烦,为什么不忽略它呢???@TomTom让我们不要在这里发疯。你可以编辑这个问题,看看他是如何成为一个新用户。这正是我想要的方式。我还想知道我处理的数据是否可以保存/传递回原始表单,甚至是文本文件/数据库?@Sensei是的,但所有这些都是不同的事情,可以以不同的方式处理。例如,如果希望返回除ShowDialog()方法返回的枚举以外的结果,则可以在弹出窗体中创建一个公共方法,例如
ShowDialogWithResults()
,该方法在其中使用ShowDialog()
,然后将结果返回到主窗体。您可以在这里看到它的可能实现:我想这是可行的,因为可能出现的唯一问题是,每次我终止子表单时,都会创建父表单的新实例,因此我最终得到相同表单的副本。