我的WPF应用程序存在一个小问题。
我有一个启动图像(作为XAML窗口)和主应用程序(作为另一个从Splash获取caleld的XAML窗口)
即使我在Splash窗口上使用此.Close()
并在主应用上工作,Splash窗口仍然可以在任务栏中看到。
如果我在主应用程序上使用此.Close
,我会在任务栏应用程序中有两个空白窗口,我必须按X才能完全关闭。
我也试过Application.Current.Shutdown()
,但结果是一样的。
飞溅:
public Splash()
{
InitializeComponent();
}
private void Window_ContentRendered(object sender, EventArgs e)
{
CloseProcedure();
}
public async void CloseProcedure()
{
//Missing data loading which will be async.
UC_Main UCMain = new UC_Main();
MainWindow window = new MainWindow();
window.AppContent.Children.Add(UCMain);
this.Close();
await Task.Delay(500); //for fade effect.
window.Show();
}
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
Closing -= Window_Closing;
e.Cancel = true;
var anim = new DoubleAnimation(0, (Duration)TimeSpan.FromSeconds(0.5));
this.BeginAnimation(UIElement.OpacityProperty, anim);
anim.Completed += (s, _) => this.Close();
}
主要应用程序
private void BTN_Close_MouseUp(object sender, MouseButtonEventArgs e)
{
this.Close();
}
private void titleBar_MouseDown(object sender, MouseButtonEventArgs e)
{
titleBar.Background = Brushes.White;
}
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
Closing -= Window_Closing;
e.Cancel = true;
var anim = new DoubleAnimation(0, (Duration)TimeSpan.FromSeconds(0.2));
this.BeginAnimation(UIElement.OpacityProperty, anim);
anim.Completed += (s, _) => Application.Current.Shutdown();
}
}
答案 0 :(得分:0)
WPF应用程序的默认关闭模式是“OnLastWindowClose”,这意味着一旦关闭最后一个窗口,将调用应用程序关闭过程,因此您不需要显式写入System.Windows.Application.Shutdown( )。
您可能有一些引用未关闭的启动画面的内容。当您打开主窗口时,应该在那时正确关闭启动屏幕并确保对它的任何引用都为空。
如果您发布所有代码,则更容易了解正确的修复方法。
要防止首先在任务栏中显示窗口,请设置Window XAML声明的 ShowInTaskbar 属性:
<Window ShowInTaskbar="False" ...
答案 1 :(得分:0)
我已经为此提出了解决方案。 我没有尝试关闭进程并使关闭事件处理程序内的淡入淡出动画,而是编写了一个淡出屏幕的异步方法,等待相同的时间然后终止进程。像魅力一样。
private void BTN_Close_MouseUp(object sender, MouseButtonEventArgs e)
{
this.FadeOut();
}
async private void FadeOut()
{
var anim = new DoubleAnimation(0, (Duration)TimeSpan.FromSeconds(0.2));
this.BeginAnimation(UIElement.OpacityProperty, anim);
await Task.Delay(200);
this.Close();
System.Diagnostics.Process.GetCurrentProcess().Kill();
}