2013-04-11 131 views
1

我已经创建了一个简单的Windows窗体,在点击按钮后打开属性窗口,现在你知道,一个属性窗口应该只打开一次,因为我是一个初学者,我依赖于你的建议: 如何让这个窗口只出现一次? 这里是小代码段(这不是我的主类 - 如果需要的按钮的方法被应用,我也能做到这一点有)只允许打开一次窗口

public partial class EinstellungenFenster : Form 
{ 
    public EinstellungenFenster() 
    { 
     InitializeComponent(); 
     Text = "Outlook Add-in Einstellungen"; 

    } 
} 

,这里的按键法使用:

 private void FensterOeffnen(object sender, IRibbonControl control, bool pressed) 
    { 
     EinstellungenFenster fenster = new EinstellungenFenster(); 
     fenster.Show(); 

    } 
+0

http://stackoverflow.com/questions/1403600/how-to-avoid-multiple-instances-of-windows-form-in-c-sharp – 2013-04-11 08:36:52

回答

6

,而不是fenster.Show()使用fenster.ShowDialog(),这可以使表单模式,这意味着没有其他家长的对话框可以使用,直到它被关闭

+0

非常感谢你 – gbbb 2013-04-11 08:43:46

+0

这应得到更多upvotes!打开单个表单实例的最简单的解决方案。 – 2017-11-02 12:51:05

3

如果你想从做其他事情而窗口阻止用户即,forcin在他们继续前,让他们关闭它,请致电ShowDialog()而不是Show()。否则,我的建议是维护一个私人领域,并检测该表单是否已经在点击时创建/显示,并且只是将表单呈现给用户以引起用户注意。

+0

这比我要求的要好,谢谢我会在6分钟内给出答案。 和Sayse是正确的,ShowModal()不起作用,它必须是 ShowDialog()。 – gbbb 2013-04-11 08:42:45

+0

糟糕...我主要在我的工作场所使用德尔福,老习惯!更新。 – James 2013-04-11 08:44:26

+0

我带了Sayse,因为他的积分少了,但是谢谢 – gbbb 2013-04-11 08:54:09

0

假设,如果我们呼吁从MDI窗体上的菜单中单击一种形式,那么我们就需要在顶层创建窗体的实例声明是这样的:

Form1 fm = null; 

然后,我们需要定义菜单单击事件来调用在Form1如下:

private void form1ToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    if (fm == null|| fm.Text=="") 
    { 
     fm = new Form1();    
     fm.MdiParent = this; 
     fm.Dock = DockStyle.Fill; 
     fm.Show(); 
    } 
    else if (CheckOpened(fm.Text)) 
    { 
     fm.WindowState = FormWindowState.Normal; 
     fm.Dock = DockStyle.Fill; 
     fm.Show(); 
     fm.Focus();    
    }     
} 

的CheckOpened定义检查Form1中已经打开与否:

private bool CheckOpened(string name) 
    { 
     FormCollection fc = Application.OpenForms; 

     foreach (Form frm in fc) 
     { 
      if (frm.Text == name) 
      { 
       return true; 
      } 
     } 
     return false; 
    } 

希望这将解决创建窗体的多个实例的问题,如果它已被打开或最小化,也将焦点放在Form1的菜单上。