2012-03-29 26 views
2

所以在我的程序中我有一個設置頁面。在設置頁面上,可以選擇將程序設置爲「始終在最上面」。當選中此選項並取消選中時,它會正確保存設置,但實際上它並未實際更改TopMost屬性本身。更改不同窗體上的TopMost屬性?

程序的主窗體被稱爲「MainForm」,但設置頁面被稱爲「SettingsForm」。我如何從「SettingsForm」中更改「MainForm」上的「TopMost」屬性?

+2

告訴我們你目前正在嘗試做什麼。 – 2012-03-29 16:19:37

+0

我目前不「嘗試」這樣做...我不知道如何。 – 2012-03-29 16:21:15

回答

1

一種方法是簡單地給SettingForm參考MainForm,例如,通過一個構造函數參數,然後將其存儲到一個字段中,以便稍後在必要時訪問它。

例如:

public class SettingsForm 
{ 
    public SettingsForm(MainForm mainForm) 
    { 
     this.mainForm = mainForm; 
    } 

    public void Apple() 
    { 
     this.mainForm.TopMost = true; 
    } 

    private readonly MainForm mainForm; 
} 

public class MainForm 
{ 
    public void Banana() 
    { 
     var settingsForm = new SettingsForm(this); 
     settingsForm.ShowDialog(); 
    } 
} 

(但是,可能沒有必要做這個如果SettingsForm所有者已經是MainForm的insntance但我無法從你給什麼告訴)

+0

我該怎麼做? – 2012-03-29 16:21:56

+0

@JasonAxelrod:我添加了一個例子。 – 2012-03-29 16:24:56

+0

我試過這個...得到了下面的錯誤:System.NullReferenceException:對象引用未設置爲對象的實例 – 2012-03-29 16:49:03

1

這是一個介體模式的好地方。 (類似於控制器)這個想法是你有一個對象創建你的所有窗口,並通過構造函數將一個對自身的引用傳遞給每個窗體。您可以從任何形式調用中介體中的方法,中介體將集中MainForm。這在Windows窗體中是非常普遍的做法。

所以,你會成爲一箇中介類,像這樣:

public class MyMediator { Form mainForm {get;set;} Form settingsForm{get;set;}

public MyMediator() 
    { 
     mainForm = new MainForm(this); 
     mainForm.Show(); 
    } 

    ... 

    public FocusMainForm() // call this from settings form 
    { 
     mainForm.TopMost = true; 
    } 


} 

+0

我不知道你剛剛說了什麼。 – 2012-03-29 16:23:43

2

您可以創建在設置形式的事件:

public event EventHandler TopMostEvent; 

private void OnTopMostEvent() 
{ 
    if (TopMostEvent != null) 
    { 
     TopMostEvent(this, EventArgs.Empty); 
    } 
} 

CheckedChanged事件調用的方法保存設置後:

OnTopMostEvent(); 

而在主窗體訂閱以事件和設置形式TopMost屬性