所以在我的程序中我有一個設置頁面。在設置頁面上,可以選擇將程序設置爲「始終在最上面」。當選中此選項並取消選中時,它會正確保存設置,但實際上它並未實際更改TopMost屬性本身。更改不同窗體上的TopMost屬性?
程序的主窗體被稱爲「MainForm」,但設置頁面被稱爲「SettingsForm」。我如何從「SettingsForm」中更改「MainForm」上的「TopMost」屬性?
所以在我的程序中我有一個設置頁面。在設置頁面上,可以選擇將程序設置爲「始終在最上面」。當選中此選項並取消選中時,它會正確保存設置,但實際上它並未實際更改TopMost屬性本身。更改不同窗體上的TopMost屬性?
程序的主窗體被稱爲「MainForm」,但設置頁面被稱爲「SettingsForm」。我如何從「SettingsForm」中更改「MainForm」上的「TopMost」屬性?
一種方法是簡單地給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但我無法從你給什麼告訴)
我該怎麼做? – 2012-03-29 16:21:56
@JasonAxelrod:我添加了一個例子。 – 2012-03-29 16:24:56
我試過這個...得到了下面的錯誤:System.NullReferenceException:對象引用未設置爲對象的實例 – 2012-03-29 16:49:03
這是一個介體模式的好地方。 (類似於控制器)這個想法是你有一個對象創建你的所有窗口,並通過構造函數將一個對自身的引用傳遞給每個窗體。您可以從任何形式調用中介體中的方法,中介體將集中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;
}
}
我不知道你剛剛說了什麼。 – 2012-03-29 16:23:43
您可以創建在設置形式的事件:
public event EventHandler TopMostEvent;
private void OnTopMostEvent()
{
if (TopMostEvent != null)
{
TopMostEvent(this, EventArgs.Empty);
}
}
在CheckedChanged
事件調用的方法保存設置後:
OnTopMostEvent();
而在主窗體訂閱以事件和設置形式TopMost屬性
告訴我們你目前正在嘗試做什麼。 – 2012-03-29 16:19:37
我目前不「嘗試」這樣做...我不知道如何。 – 2012-03-29 16:21:15