我见过这么多样本,为了打开关闭的窗口,我应该在关闭事件中隐藏窗口,但如果我在工作中间关闭窗口并再次打开同一个窗口显示我,这对我来说不公平我离开的内容,因为我之前隐藏了窗口。那么我怎么能在关闭或隐藏窗户后重新开始我的窗户。
目前我正在调用winload方法,即在调用隐藏窗口的show方法后显示新窗口。
private PurgeData data=new PurgeData();
private void MenuPurgeData_Click(object sender, RoutedEventArgs e)
{
try
{
if (PurgeData == null)
{
PurgeData = new PurgeData();
PurgeData.Show();
}
else
{
PurgeData.WinLoad();
PurgeData.Show();
}
}
谢谢, @nagaraju。
答案 0 :(得分:9)
如果你想要隐藏/显示的行为,你根本不应该在窗口上调用Window.Close(),而是通过调用Window.Hide()来隐藏它。如果用户关闭了它并且无法避免关闭,您可以尝试以下操作。覆盖窗口内的OnClosing并将e.Cancelled设置为true,然后调用.Hide()。即使用户关闭窗口,这也应该允许隐藏/显示窗口。
// Disclaimer, untested!
protected override void OnClosing(CancelEventArgs e)
{
e.Cancel = true; // cancels the window close
this.Hide(); // Programmatically hides the window
}
修改强>
好的我现在已经正确地阅读了你的问题;-) 那么我怎样才能在关闭或隐藏窗口后重新开始我的窗口。
当您使用上面的内容重新显示窗口时,它当然将与之前隐藏的窗口相同,因此将具有相同的数据和状态。如果你想要全新的内容,你需要创建一个新的Window()并在其上调用Window.Show()。如果您隐藏/显示如上所示,那么您将在隐藏窗口之前将窗口恢复到完全相同的状态。
您是否在WPF应用程序中使用MVVM模式?如果是这样,您可以尝试以下方法。通过将所有数据放在ViewModel中并通过View绑定(即:没有业务逻辑或Window后面的代码中的数据),您可以在ViewModel上调用一个方法,以便在显示窗口时重置所有数据。您的绑定将刷新,窗口状态将被重置。请注意,只有在您正确地遵循MVVM并将主窗体上的所有元素绑定到ViewModel属性(包括子控件)时,这才有效。
致以最诚挚的问候,
答案 1 :(得分:1)
这实际上取决于您的应用的结构。由于您没有维护状态,因此您只需要保存已关闭的实际窗口类型。根据您正在使用的窗口类型,您可以为其分配一个ID(例如,在其Tag
属性中),以便以后可以识别它。然后,您可以在Closing
的{{1}}事件中推送此ID。然后,如果用户重新打开它,则弹出堆栈以获取ID并检查对应的窗口。然后,您可以重新打开该窗口。
当然,Stack
只是一种数据结构,它可能适合您,也可能不适合您。使用堆栈意味着用户可以重新打开他们关闭的所有过去的窗口,但也许您可能只想要一个窗口。
编辑 - 基本代码:
Stack
答案 2 :(得分:0)
this.Opacity = 0
“关闭窗口”
this.Opacity = 1
“重新打开”
有关Hide()方法的说明:实际上,在另一个类中,该窗口将被视为已关闭,并且在使用ShowDialog()方法之后,该代码将继续。使用“不透明度”属性可解决此问题。