Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Caliburn Micro:确保在应用程序';之前调用了所有激活;s关闭_C#_Wpf_Caliburn.micro_Dispose_Application Shutdown - Fatal编程技术网

C# Caliburn Micro:确保在应用程序';之前调用了所有激活;s关闭

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

我有一个WPF/Caliburn应用程序,它有一个
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定义更新了帖子。