在我的WPF應用程序(csharp)中,我有一個事件處理程序,它在觸發時會打開應用程序的一個新窗口(窗口B)並顯示一些數據。但是,當再次觸發事件時,如果新窗口(窗口B)仍處於打開狀態,我不想生成窗口B的另一個實例,只是更新當前實例中顯示的數據。所以問題是:如何檢測窗口B是否已經打開,如果尚未打開,否則只是更新數據?wpf檢測打開的窗口
我發現Application.Current.Window集合,但不知何故,這對我還沒有工作。想法?
在我的WPF應用程序(csharp)中,我有一個事件處理程序,它在觸發時會打開應用程序的一個新窗口(窗口B)並顯示一些數據。但是,當再次觸發事件時,如果新窗口(窗口B)仍處於打開狀態,我不想生成窗口B的另一個實例,只是更新當前實例中顯示的數據。所以問題是:如何檢測窗口B是否已經打開,如果尚未打開,否則只是更新數據?wpf檢測打開的窗口
我發現Application.Current.Window集合,但不知何故,這對我還沒有工作。想法?
您就可在窗口B一LOADWINDOW()方法,你可以調用加載(或刷新),將工作數據&無論如果窗口已經打開與否。有它採取委託打電話的時候,這個窗口被關閉:
private Action ParentCallbackOnClose;
public void LoadWindow(Action parentCallbackOnClose) {
// load the data (set the DataContext or whatever)
ParentCallbackOnClose = parentCallbackOnClose;
// Open the window and activate/bring to the foreground
Show();
Activate();
}
,有你的窗口關閉事件調用close委託:
private void WindowClosed(object sender, EventArgs e) {
ParentCallbackOnClose.Invoke();
}
現在,從打開窗口B您的課,有它保持它打開的實例,這樣如果有人試圖重新加載WindowB時,如果WindowB已經打開,它只會在現有實例上調用LoadWindow。喜歡的東西...
private WindowB WinB;
private void LoadWindowB(Content content)
{
if (WinB == null){
WinB = new WindowB();
}
WinB.LoadWindow(content, WindowBClosed);
}
然後你可以把它空出來WinB上接近回調,所以如果WinB被關閉,那麼下一次LoadWindowB()被調用時,它將創建它的一個新的實例:
private void WindowBClosed(){
WinB = null;
}
編輯:oops,我的答案是特定於Windows窗體。我剛纔看到了WPF的提及。我不確定WPF的具體代碼是什麼,但我會想象它在概念上並不完全一樣。我想在WPF的屬性被稱爲可見性,而不是可見光
你可以堅持自己的窗口的實例(或使其成爲Singleton),然後當你需要確定它是否是可見或不可見,檢查它的可見財產。
例如:
if(myWindow.Visible){
myWindow.Hide();
}else{
myWindow.Show();
}
This article它是我發現用於在WPF頁面之間傳遞數據的最佳選擇。作者使用KISS方法提供了一個簡單的解決方案。
由於這是谷歌列出的第一個鏈接,幾年前發佈,爲解決方案檢查Window
是否已經打開,我會發布我的答案,爲其他人,我覺得更容易實現。 ChildWindow
只從MainWindow
調用,所以沒有其他Window
需要做任何檢查。
private void OpenChildWindow()
{
if (this.OwnedWindows.OfType<ChildWindow>().Count() > 0)
{
ChildWindow Win = this.OwnedWindows.OfType<ChildWindow>().First();
Win.Activate();
}
else
{
ChildWindow Win = new ChildWindow();
Win.Owner = this;
Win.Show();
}
}
有一種老式的方式來使用界面來做到這一點。我在Java中看到這很多,作爲彌補沒有委託的一種方式(糾正我,如果我錯了)。這種方法將允許你檢查是否有一個窗口已經打開(任何種類)。原始響應工作得很好,但你也可以做到這一點通過以下方式:
創建接口
public interface IWindowTracker
{
void WindowIsOpened();
void WindowIsClosed();
}
實現父接口(從正在打開):
public partial class MainWindow : Window, IWindowTracker
在你的構造函數中,接受一個IwindowTracker接口的對象。實例保存以備將來使用
IWindowTracker windowTracker;
public ProjectManager(IWindowTracker parentWindowTracker)
{
windowTracker = parentWindowTracker;
InitializeComponent();
}
設置調用到窗口跟蹤對象
protected override void OnActivated(EventArgs e)
{
windowTracker.WindowIsOpened();
base.OnActivated(e);
}
protected override void OnClosed(EventArgs e)
{
windowTracker.WindowIsClosed();
base.OnClosed(e);
}
終於實現IWindowTracker在父WPF窗口
bool windowIsOpen = false;
public void WindowIsOpened()
{
windowIsOpen = true;
}
public void WindowIsClosed()
{
windowIsOpen = false;
}
這將允許你跟蹤窗口是否仍然打開,如果是,則不需要打開它的新實例:
if (!windowIsOpen)
{
remoteProjectManager = new ProjectManager(this);
remoteProjectManager.Show();
}
remoteProjectManager.Focus();
調用顯示()已關閉窗口上似乎拋出一個異常,所以我的猜測是,有一些其他的方式,或者,如果你已經關閉了窗口,該窗口在技術上是「破壞」
的好的一點是,我可以檢測窗口是否仍然打開並關注它(以便再次顯示在前面)。
注意:這裏有一個缺點,因爲在這個設置中它限制了你一次只打開一個窗口(假設你所有的窗口都是這樣實現的)。就我而言,我只想在主窗口之外打開一個窗口。
您可能還想檢查您的窗口是否爲空,因爲它可能不是您必須打開的唯一窗口。