我正在研究一个简单的项目来学习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 ...
}
}
}
答案 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 ...
}
}