繁体   English   中英

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

[英]Application exits after closing modal Dialog

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

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

当我启动我的应用程序时, MainViewModel的视图未显示,但弹出了模态。 当我TryClose(true) in Start()使用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 ...
        }
    }
}

在关闭设置对话框之前, 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 ...
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM