关闭模态对话框后应用程序退出

时间:2017-08-24 13:42:41

标签: c# .net wpf dependency-injection caliburn.micro

我正在研究一个简单的项目来学习Caliburn.Micro

我有两个ViewModels SettingsViewModel MainViewModel 。我希望在将 SettingsViewModel 显示为模式对话框之后立即显示 MainViewModel ,以便用户可以在启动之前配置应用程序。

当我启动我的应用程序时, MainViewModel 的视图不会显示,但会弹出模式。当我用TryClose(true) in Start()关闭对话框时,我的应用程序将退出。我只想关闭 SettingsViewModel ,以便我可以继续Handle(Settings message) in MainViewModel

AppBootstrapper:

protected override void OnStartup(object sender, StartupEventArgs e)
{
     DisplayRootViewFor<MainViewModel>();
}

SettingsViewModel:

using Caliburn.Micro;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace AbrechnungPSA.ViewModels
{
    class SettingsViewModel : Screen
    {
        private IEventAggregator _eventAggregator;

        public SettingsViewModel(IEventAggregator eventAggregator)
        {  
            _eventAggregator = eventAggregator;
        }

        /// <summary>
        /// Starts the Main Application
        /// </summary>
        public void Start()
        {
            TryClose(true); 

            _eventAggregator.PublishOnUIThread(new Settings());           
        }
    }
}

MainViewModel:

using Caliburn.Micro;
using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;

namespace AbrechnungPSA.ViewModels
{
    public class MainViewModel : PropertyChangedBase, IHandle<Settings>
    {
        private Settings _settings;

        private readonly IEventAggregator _eventAggregator;
        private readonly IWindowManager _windowManager;

        public MainViewModel(IEventAggregator eventAggregator, IWindowManager windowManager)
        {
            _eventAggregator = eventAggregator;
            _eventAggregator.Subscribe(this);

            _windowManager = windowManager;

            dynamic settings = new ExpandoObject();
            settings.WindowStartupLocation = WindowStartupLocation.CenterOwner;
            settings.ResizeMode = ResizeMode.NoResize;

            var result = _windowManager.ShowDialog(new SettingsViewModel(_eventAggregator), null, settings);
        }

        /// <summary>
        /// Receive User adjusted Settings and start Application
        /// </summary>
        /// <param name="message"></param>
        public void Handle(Settings message)
        {
            _settings = message;

            // Continue here ...
        }
    }
}

1 个答案:

答案 0 :(得分:1)

在设置对话框关闭之前,ShowDialog方法不会返回。

OnStartup方法中显示设置对话框:

<强>引导程序:

protected override void OnStartup(object sender, StartupEventArgs e)
{
    base.OnStartup(sender, e);
    DisplayRootViewFor<MainViewModel>();

    dynamic settings = new ExpandoObject();
    settings.WindowStartupLocation = WindowStartupLocation.CenterOwner;
    settings.ResizeMode = ResizeMode.NoResize;

    var settingsVm = new SettingsViewModel(_container.GetInstance<IEventAggregator>());
    var result = _container.GetInstance<IWindowManager>()
        .ShowDialog(settingsVm, null, settings);

    settingsVm.Start();
}

MainViewModel:

class MainViewModel : PropertyChangedBase, IHandle<Settings>
{
    private Settings _settings;

    private readonly IEventAggregator _eventAggregator;
    private readonly IWindowManager _windowManager;

    public MainViewModel(IEventAggregator eventAggregator, IWindowManager windowManager)
    {
        _eventAggregator = eventAggregator;
        _eventAggregator.Subscribe(this);
        _windowManager = windowManager;
    }

    public void Handle(Settings message)
    {
        _settings = message;
        // Continue here ...
    }
}