You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么我实现的仅允许打开单个WPF Window实例的功能无法正常运行?

问题原因分析
  • 实例化窗口时机错误:你将QualiWindow的实例化代码放在了窗口数量统计逻辑之前,只要执行了实例化代码,不管后续是否调用Show(),新实例都会被自动加入Application.Current.Windows集合,导致统计结果被干扰。
  • 统计逻辑缺漏状态判断:WPF中窗口调用Close()关闭后,默认不会立刻从Application.Current.Windows集合中移除,你仅判断窗口标题,没有过滤已经关闭的无效实例,关闭后的窗口依然会被统计到总数中。
  • 判断条件逻辑错误:提前实例化新窗口后,判断temp == 1才执行打开逻辑。首次打开时实例化后统计数为1可以正常打开;原有窗口关闭后残留的实例仍然在集合中,再次操作时实例化新窗口后统计数会变为2,不符合判断条件,因此无法打开新窗口。
修复方案

将窗口实例化操作放在统计逻辑之后,统计时新增窗口有效状态的判断,仅当没有有效运行的实例时再新建打开窗口,参考代码如下:

// 先统计当前有效打开的目标窗口数量
int validWindowCount = 0;
foreach (Window window in Application.Current.Windows)
{
    // 同时匹配标题、窗口已加载、处于可见状态三个条件
    if (window.Title == "QUALI-NET" && window.IsLoaded && window.IsVisible)
    {
        validWindowCount++;
        // 匹配到就可以跳出循环,不需要遍历完全部
        break;
    }
}

if (validWindowCount == 0)
{
    // 没有已打开的实例时再新建并打开
    QualiWindow WPFQuali = new QualiWindow(Mandant, Data.GetValue<string>("Artikelnummer"));
    WPFQuali.Show();
}
// 可选优化:已有实例时直接激活前置,提升用户体验
else
{
    var existWindow = Application.Current.Windows
        .OfType<Window>()
        .First(w => w.Title == "QUALI-NET" && w.IsLoaded && w.IsVisible);
    existWindow.Activate();
    if (existWindow.WindowState == WindowState.Minimized)
    {
        existWindow.WindowState = WindowState.Normal;
    }
}

更稳妥的优化方案

如果不需要依赖窗口标题判断,建议直接通过窗口类型过滤,避免出现重名窗口导致的判断错误:

// 直接统计QualiWindow类型的有效运行实例
int validWindowCount = Application.Current.Windows
    .OfType<QualiWindow>()
    .Count(w => w.IsLoaded && w.IsVisible);

内容的提问来源于stack exchange,提问作者user16713737

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 01:54:03