在我的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();
调用显示()已关闭窗口上似乎抛出一个异常,所以我的猜测是,有一些其他的方式,或者,如果你已经关闭了窗口,该窗口在技术上是“破坏”
的好的一点是,我可以检测窗口是否仍然打开并关注它(以便再次显示在前面)。
注意:这里有一个缺点,因为在这个设置中它限制了你一次只打开一个窗口(假设你所有的窗口都是这样实现的)。就我而言,我只想在主窗口之外打开一个窗口。
您可能还想检查您的窗口是否为空,因为它可能不是您必须打开的唯一窗口。