【问题标题】:Application exits after closing modal Dialog关闭模态对话框后应用程序退出
【发布时间】:2017-08-24 13:42:40
【问题描述】:

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

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

当我启动我的应用程序时,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 ...
        }
    }
}

【问题讨论】:

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


    【解决方案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 ...
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-29
      • 2013-03-15
      • 2012-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      • 1970-01-01
      相关资源
      最近更新 更多