C# Caliburn Micro:确保在应用程序';之前调用了所有激活;s关闭
我有一个WPF/Caliburn应用程序,它有一个C# Caliburn Micro:确保在应用程序';之前调用了所有激活;s关闭,c#,wpf,caliburn.micro,dispose,application-shutdown,C#,Wpf,Caliburn.micro,Dispose,Application Shutdown,我有一个WPF/Caliburn应用程序,它有一个ShellView,其中包括TabControl,其中每个TabItem对应于单个ViewModel(它们都继承Screen)。 一些ViewModels在OnDeactivate中实现了dispose逻辑: protected override void OnDeactivate(bool close) { if (close) _disposeList.Dispose(); base.OnDeactivate
ShellView
,其中包括TabControl
,其中每个TabItem
对应于单个ViewModel
(它们都继承Screen
)。一些
ViewModels
在OnDeactivate
中实现了dispose逻辑:
protected override void OnDeactivate(bool close)
{
if (close)
_disposeList.Dispose();
base.OnDeactivate(close);
}
public override async void TryClose(bool? dialogResult = default(bool?))
{
// some dispose logic here
base.TryClose(dialogResult);
await Task.Run(() =>
{
// show closing message for 2 sec
using (StartBusy(ViewModelBusyReason.Closing))
{
Thread.Sleep(2000);
}
});
Application.Current.Shutdown();
// Environment.Exit(0);
}
ShellViewModel
覆盖TryClose
:
protected override void OnDeactivate(bool close)
{
if (close)
_disposeList.Dispose();
base.OnDeactivate(close);
}
public override async void TryClose(bool? dialogResult = default(bool?))
{
// some dispose logic here
base.TryClose(dialogResult);
await Task.Run(() =>
{
// show closing message for 2 sec
using (StartBusy(ViewModelBusyReason.Closing))
{
Thread.Sleep(2000);
}
});
Application.Current.Shutdown();
// Environment.Exit(0);
}
当应用程序关闭时,它只在1或2个虚拟机上调用OnDeactivate
,然后应用程序关闭。如何保证在应用程序关闭之前在所有虚拟机上调用
OnDeactivate
我试图在TryClose
中添加Sleep,但没有成功
还有:是否有一种规范的Caliburn方法可以在ShellViewModel
上实现TryClose
?也就是说,我是否必须调用
Application.Current.Shutdown()
或Environment.Exit(0)
或两者都不调用
ShellViewModel
定义:
public class ShellViewModel : Conductor<Screen>.Collection.OneActive
{
public ShellViewModel(/*some params here*/)
{
Items.Add(Bootstrapper.Resolve<ViewModelOne>());
Items.Add(Bootstrapper.Resolve<ViewModelTwo>());
Items.Add(Bootstrapper.Resolve<ViewModelThree>());
// ...more VMs here
}
公共类ShellViewModel:Conductor.Collection.OneActive
{
公共ShellViewModel(/*此处有一些参数*/)
{
Items.Add(Bootstrapper.Resolve());
Items.Add(Bootstrapper.Resolve());
Items.Add(Bootstrapper.Resolve());
//…这里有更多虚拟机
}
从ShellViewModel
的trcyclose
方法调用每个子视图模型的trcyclose
方法:
//ShellViewModel:
public override void TryClose(bool? dialogResult = null)
{
base.TryClose(dialogResult);
//...
foreach (var item in Items)
item.TryClose();
}
此外,任何使用IDisposable
字段的视图模型都应实现IDisposable
接口:
public sealed class ViewModelTwo : Screen, IDisposable
{
...
public override void TryClose(bool? dialogResult = null)
{
Dispose();
base.TryClose(dialogResult);
}
public void Dispose()
{
_disposeList?.Dispose();
}
}
好的,我终于想出了一个解决方案:
// ShellViewModel
public override void TryClose(bool? dialogResult = default(bool?))
{
_disposeList.Dispose();
while (Items.Any())
DeactivateItem(Items.First(), true);
base.TryClose(dialogResult);
Application.Current.Shutdown();
}
并在每个虚拟机中覆盖OnDeactivate
:
protected override void OnDeactivate(bool close)
{
_disposeList.Dispose();
base.OnDeactivate(close);
}
ShellViewModel是否保留对其他视图模型的引用,或者它们是如何初始化的以及在何处初始化的?您不能覆盖ShellViewModel的CanClose方法并在其中处理子视图模型吗?@mm8:我已经用VMs定义更新了帖子。