gpt4 book ai didi

c# - 为什么 WPF 窗口在 MainWindow 关闭后不自动处理和收集?

转载 作者:太空狗 更新时间:2023-10-30 00:41:22 25 4
gpt4 key购买 nike

我一直想知道这个问题,正在寻找最佳解决方案。要重现此问题,只需:

  1. 在新的 WPF 应用程序中添加一个新窗口。
  2. 添加以下代码:

    public MainWindow()
    {
    InitializeComponent();
    //add code
    Window1 w1 = new Window1();
    //following is in my actual project
    DataContext = new AllUserQueryiesViewModel(new CommonQueryTestSubWindow());
    }
  3. 运行并关闭 MainWindow。

此时,我希望应用程序关闭,但我的 VS2010 似乎仍在运行。那么为什么以及如何解决呢?

--------更新----------------

我想我最好给出我真实项目中的风景,让你更好地理解我为什么这样做这个。想想查询列表和开放式查询功能,就像 TFS 工作项查询那样。我正在创建一些用户控件来执行此操作,供我们团队中的其他人在同一应用程序中使用。 查询列表和打开的查询位于单独的用户控件中,因此用户(其他程序员)可以将打开的查询放在他们想要的任何地方(ContentControl)。 View 模型:

public class AllVM

{
public AllVM(IOneVMContainer container)
{
OneVMs = new ObservableCollection<OneVM>()
{
new OneVM(container),
new OneVM(container)
};
}

public ObservableCollection<OneVM> OneVMs { get; set; }
public OneVM SelectedOneVM { get; set; }

public void OpenOne()
{
SelectedOneVM.Open();
}
}

public class OneVM
{
IOneVMContainer container;
public OneVM(IOneVMContainer container)
{
this.container = container.NewInstance();
}
//I want to open and close the view from viewmodel
public void Open()
{
container.GetContentCtl().Content = this;
container.Show();
}
public void Close()
{
container.Close();
}
}

为了打开和关闭 ViewModel 中的 View ,我创建了这样的接口(interface)

//Is it good to use interface?
//Maybe a better interface?
public interface IOneVMContainer
{
IOneVMContainer NewInstance();
void Show();
void Close();
ContentControl GetContentCtl();
}

上述 ViewModels 的使用:

//my usercontrol to hold AllVM
public AllUC()
{
InitializeComponent();
DataContext = new AllVM(new OneContainerWindow());
}

//implement by other team members
public partial class OneContainerWindow : Window,IOneVMContainer
{
public OneContainerWindow()
{
InitializeComponent();
}
public IOneVMContainer NewInstance()
{
return new OneContainerWindow();
}
public ContentControl GetContentCtl()
{
return contentCtl1;
}
}

所以我想知道是否在 ViewModel 中存储一个窗口是不可避免的,这导致了主要问题。我知道您一定有更好的解决方案,请帮忙。

最佳答案

首先不要在构造函数中实例化一个新窗口。

现在,对于您的问题,您需要设置 Owner窗口的:

public MainWindow()
{
InitializeComponent();
Loaded += MainWindow_Loaded;
}

void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
Window w = new Window() { Owner = this };
}

这样子窗口应该被正确处理。

关于c# - 为什么 WPF 窗口在 MainWindow 关闭后不自动处理和收集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21133420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com