为什么手动调用window的Close的函数并没有达到真正关闭窗口的效果?

Philipyexushen 2016-11-27 12:45:34

private void ControlTypeSelectingBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
try
{
Type type = ControlTypeSelectingBox.SelectedItem as Type;

if (type == null)
throw new ArgumentNullException("Type is null");

ConstructorInfo info = type.GetConstructor(System.Type.EmptyTypes);
Control control = info.Invoke(null) as Control;

Window window = control as Window;

//注意,下面必须要有打开窗口或者把控件放入grid的操作,这样才能让下面的template正确显示出来
if (window != null)
{
window.WindowState = System.Windows.WindowState.Minimized;
window.ShowInTaskbar = false;
window.Show();
}
else
{
control.Visibility = Visibility.Collapsed;
grid.Children.Add(control);
}

ControlTemplate template = control.Template;

XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;

StringBuilder strbuilder = new StringBuilder();
XmlWriter writer = XmlWriter.Create(strbuilder, settings);
XamlWriter.Save(template, writer);

txtTemplateBrowser.Text = strbuilder.ToString();

if (window == null)
//TODO:为什么这里手动关闭以后无法完整关闭窗口?
grid.Children.Remove(control);
else
{
window.Close();
window = null;
}

}
catch (Exception ex)
{
txtTemplateBrowser.Text = "<< Error generating template:" + ex.Message + ">>";
}
}

我写了一段这样的代码,来实现获取Control的template,却发现一个这样的问题,就是当我打开了一个window以后,手动调用Close(),窗口的确是消失了,但是当我关闭了主窗口以后,却发现程序没有退出。

但是如果我不手动调用Close(),而是让window调用Show以后我点窗口上的关闭键,那就可以彻底退出了(手动点击×以后再关闭主窗口程序可以彻底退出了)。

然后我再在主窗口重写OnClosed方法
protected override void OnClosed(EventArgs e)
{
var collections = Application.Current.Windows;

foreach (Window window in collections)
{
if (window != this)
window.Close();
}

base.OnClosed(e);
}


发现这样以后,程序也可以彻底退出

这究竟是什么原因呢?
...全文
787 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Philipyexushen 2016-12-03
  • 打赏
  • 举报
回复
我自己找到原因了

原来在WPF中,打开window,并且show以后,是会打开两个东西的,一个是窗口自己,另一个就是修饰窗口一个AdornerLayer


如果直接对Window进行Close,就无法关闭AdornerLayer,导致最后关闭窗口的时候AdornerLayer就无法关闭的问题,如果手动按关闭按钮,是会把AdornerLayer也关闭的,即使设置Owner也是无效的(或者说这个属性本身也是无效的,因为我设了Owner以后,主窗口根本没加入新创建的窗口)。

关闭AdornerLayer以后主程序正常退出

谢谢各位了
muzizongheng 2016-12-03
  • 打赏
  • 举报
回复
应该是子窗体的线程还没退出, 虽然主ui关了, 但因为子线程没退出, 导致进程还在. 1.改动的话, 试着把子窗体的parent和owner设置为主窗体.
Philipyexushen 2016-12-01
  • 打赏
  • 举报
回复
引用 1 楼 muzizongheng 的回复:
Type type = ControlTypeSelectingBox.SelectedItem as Type; if (type == null) throw new ArgumentNullException("Type is null"); ConstructorInfo info = type.GetConstructor(System.Type.EmptyTypes); Control control = info.Invoke(null) as Control; Window window = control as Window; 我想问下, 上面这段代码为什么这样用?
这是《Pro WPF in C# 2012》的一段代码,这个函数是用来显示Control的模板的,因为窗口在实际显示控件之前,空闲模板是空的,如果不实例化控件然后用xmWirtter会出错,所以我要实例化Control并且假装把它放在Grid里面(只是不可见),但是window不能放grid,必须要打开,所以就这样写了
Philipyexushen 2016-12-01
  • 打赏
  • 举报
回复
引用 5 楼 duanzi_peng 的回复:
[quote=引用 4 楼 Philipyexushen的回复:][quote=引用 3 楼 duanzi_peng 的回复:]
主窗口当然应该用:Application.Current.Shutdown();


然而我不是要关闭主窗口,我需要关闭的是我打开的那个窗口[/quote]
你是怎么关闭主窗口的[/quote]

举个例子吧。比如我调试模式下加载了window的模板


这个时候,我的代码是有调用了window.Close()的(我贴的那段的第44行)

然后我手动关闭主窗口,不是用的Application.Shutdown,直接点窗口的关闭


然后主窗口是关闭了,但是你看到调试并没有退出,而且在进程列表还是可以看到程序在跑的




当我打开控件模板的时候是不会这样的,唯独打开window的模板是这样,我想是不是window占了资源没有被释放。

然后我在窗口重写OnClosed方法以后,发现现在点关闭按钮可以全部退出了,故此有疑问。
  • 打赏
  • 举报
回复
窗口的确是消失了,但是当我关闭了主窗口以后,却发现程序没有退出。 >是操作关闭主窗口,导致程序没有退出。
  • 打赏
  • 举报
回复
引用 4 楼 Philipyexushen的回复:
[quote=引用 3 楼 duanzi_peng 的回复:] 主窗口当然应该用:Application.Current.Shutdown();
然而我不是要关闭主窗口,我需要关闭的是我打开的那个窗口[/quote] 你是怎么关闭主窗口的
Philipyexushen 2016-12-01
  • 打赏
  • 举报
回复
引用 3 楼 duanzi_peng 的回复:
主窗口当然应该用:Application.Current.Shutdown();
然而我不是要关闭主窗口,我需要关闭的是我打开的那个窗口
  • 打赏
  • 举报
回复
主窗口当然应该用:Application.Current.Shutdown();
muzizongheng 2016-11-29
  • 打赏
  • 举报
回复
Type type = ControlTypeSelectingBox.SelectedItem as Type; if (type == null) throw new ArgumentNullException("Type is null"); ConstructorInfo info = type.GetConstructor(System.Type.EmptyTypes); Control control = info.Invoke(null) as Control; Window window = control as Window; 我想问下, 上面这段代码为什么这样用?

8,756

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧