如何检查窗口是否已打开?重复的窗户
本文关键字:窗户 是否 何检查 检查 窗口 | 更新日期: 2023-09-27 18:06:36
我有一个打开窗口的按钮。
如果再次按下该按钮,将打开相同窗口的副本。
info = new Info();
info.Owner = Window.GetWindow(this);
info.Show();
如何检查窗口是否已经打开,并拒绝再次打开副本?
我不能使用info.ShowDialog()
,因为它禁用了Main Window
。
不工作的解决方案:
Info info = new Info();
if (!info.IsActive)
{
info = new Info();
info.Owner = Window.GetWindow(this);
info.Show();
}
Info info = new Info();
if (info.Visibility != Visibility.Visible)
{
info.Owner = Window.GetWindow(this);
info.Show();
}
public static bool IsWindowOpen<T>(string name = "") where T : Window
{
return string.IsNullOrEmpty(name)
? Application.Current.Windows.OfType<T>().Any()
: Application.Current.Windows.OfType<T>().Any(w => w.Name.Equals(name));
}
private void buttonInfo_Click(object sender, RoutedEventArgs e)
{
if (!IsWindowOpen<Window>("Info"))
{
Info info = new Info();
info.Owner = Window.GetWindow(this);
info.Show();
}
}
仅在value不为空时创建表单。如果窗体已关闭,则使用FormClosed事件将该值放回null。
public static Info info;
if(info == null){
info = new Info();
info.Show();
}
把一个事件表单放在info表单上
private void info_FormClosed(object sender, FormClosedEventArgs e)
{
MainForm1.info = null;
}
明智的方法是只跟踪Window实例,这样您就不必稍后再找到它。添加一个字段:
private Info infoWindow;
如果它是空的,那么你知道这个窗口还不存在,所以你想要创建它。使用Closed事件将变量设置回null。如果它不为空,那么您要确保恢复窗口。所以:
private void button_Click(object sender, RoutedEventArgs e) {
if (infoWindow == null) {
infoWindow = new Info();
infoWindow.Closed += (s, ea) => infoWindow = null;
infoWindow.Owner = this; // optional
infoWindow.Show();
}
else {
if (infoWindow.WindowState == WindowState.Minimized) {
infoWindow.WindowState = WindowState.Normal;
}
infoWindow.Activate();
}
}
你可能还想在包含按钮的窗口关闭时自动关闭窗口:
private void Window_Closed(object sender, EventArgs e) {
if (infoWindow != null) infoWindow.Close();
}
您可以使用.IsLoaded
字段或绑定.ContentRendered
事件
编辑1 -
Window1:
public class Window1 : Window
{
private Info info = null;
private Boolean IsInfoOpened = false;
protected void OpenInfo()
{
if (this.IsInfoOpened) return;
this.info = new Info();
this.info.ContentRendered += delegate { this.IsInfoOpened = true; };
this.info.Closed += delegate { this.IsInfoOpened = false; }
this.info.Show();
}
}