我有一个WPF应用程序,它有多个可以打开的窗口。当我运行程序(从VS 2013调试)时,它会打开MainWindow.xaml
。当我告诉MainWindow
打开辅助Window
(让我们称之为Win2.xaml
)时,它会打开就好了。我可以输入条件,在SQL DB中搜索数据,并完成基本的INSERT,UPDATE,DELETE工作。
就本次对话而言,假设我曾在Customer1
工作过。 Customer1
现已完成,因此我保存数据并关闭窗口Win2.xaml
(使用Close()
)。一段时间过去了,数据库有一个例程来更改数据元素(标记项目已完成,不允许Win2.xaml
在搜索中找到Customer1
的记录。即WHERE SENT = 0
现在例程已经Customer1
更改为SENT = 1
)。现在我决定再次打开Win2.xaml
(注意:我还没有关闭MainWindow.xaml
,它仍在运行)因为我想做更多的工作。 IF 我根据应用程序中的存储过程和逻辑搜索Customer1
,我找不到记录;但是,检索按钮会为客户提取最后的已知数据。如果我在Retrieve按钮后面运行Stored Proc,它会返回该客户的0条记录,这正是我所期望的。
即使在Win2.xaml
之后,Close()
似乎也在保留资源。如果我只是重新启动调试(或停止调试并再次启动它),Win2.xaml
将返回“No Customers Found”消息。
那么,我能在这做什么?这只是VS中的调试问题吗?如何彻底破坏窗口各个方面已知的所有记录,并将每个新开放视为一个真正的新窗口?
以下是一些代码:
如何从MainWindow.xaml打开窗口
private void ListViewItem_DoubleClick(object sender, MouseButtonEventArgs e)
{
var obj = (DependencyObject) e.OriginalSource;
while (obj != null && !Equals(obj, PharmacyLv))
{
if (obj.GetType() == typeof (ListViewItem))
{
// ReSharper disable once InconsistentNaming
var Item = (ListViewItem) sender;
var pf = (Forms) Item.Content;
var msgTitle = "Form Request " + pf.FormNamePharm;
var msgCaption = "You requested to open " + pf.FormCodePharm + " - " + pf.FormNamePharm +
". \nPress OK to continue or CANCEL to select again.";
var result = MessageBox.Show(msgCaption, msgTitle, MessageBoxButton.OKCancel,
MessageBoxImage.Question);
switch (result)
{
case MessageBoxResult.OK:
switch (pf.FormCodePharm)
{
case "Win2":
Win2();
Log.Info("Opening Win2");
break;
// more cases here...
case "":
break;
}
break;
case MessageBoxResult.No:
break;
}
break;
}
obj = VisualTreeHelper.GetParent(obj);
}
}
以下是Win2()
的代码private void Win2()
{
var wn = new Win2();
wn.Show();
Log.Info("Initiating Win2");
}
最后,这是关于Win2的结果......此外,解决这个问题的麻烦工作是在Window_Closed代码中。我真的不想这样做......
// Saying GoodBye gracefully...
private void Window_Closing(object sender, CancelEventArgs e)
{
if (MessageBox.Show(
"Be Sure That All Forms Are Completed Before Closing The Application.\nDo You Want To Close This Program?",
"Application Close Confirmation", MessageBoxButton.YesNo, MessageBoxImage.Warning) !=
MessageBoxResult.OK) return;
Close();
}
private void Window_Closed(object sender, EventArgs e)
{
System.Windows.Forms.Application.Restart();
System.Windows.Application.Current.Shutdown();
}
如果我不得不下注,我需要在MainWindow.xaml.cs中做更多的事情来处理旧表单并在双击时创建一个新表单,但像往常一样,我对如何做是无能为力的这一点。
答案 0 :(得分:1)
根据您在此处显示的代码,看起来您的Win2窗口每次都被正确销毁并重新创建。当wn超出范围(在Win2方法中)时,它将被释放。即使它不是,您每次都会创建一个新窗口实例(使用new关键字),因此在最差的情况下你通过持有多个窗口实例来泄漏内存:
var wn = new Win2();
您确定自己没有抓住该窗口的外的全局状态,例如在您的MainWindow或其他地方,例如某些DataTable或查询结果?这似乎是一个更可能的罪魁祸首。确保所有这些都是在窗口中创建的,而不是由其他地方的全局实例保存。