【问题标题】:Caliburn.Micro Starting the bootstrapper from code?Caliburn.Micro 从代码启动引导程序?
【发布时间】:2013-05-10 20:35:28
【问题描述】:

通常我只是 App.xaml 资源中的引导程序,但对于我正在构建的应用程序,我需要在其他地方开始执行代码,然后在我完成初始化代码后启动引导程序。

如何启动引导程序?

我将 App.xaml 设置为调用函数,然后这样做:

using System.Windows;

namespace WpfApplication9
{
    public partial class App : Application
    {
        private AdminBootstrapper b;

        private void App_OnStartup(object sender, StartupEventArgs e)
        {
            //DO initialization

            b = new AdminBootstrapper();
            b.Start();
        }
    }
}

当我运行时,什么也没有发生,我的视图也没有出现。我知道视图/视图模型可以工作,因为如果我将引导程序放在 App.xaml 的资源部分中,它就会出现。

我在这里做错了什么?

【问题讨论】:

  • 也许在启动阶段还为时过早 - 这可能是它在资源中起作用的原因:当资源被解析和加载时,引导程序被实例化 - 也许 OnStartup 对 CM 来说太早了注册东西所需的位。创建一个新的引导程序调用Bootstrapper.Start,所以你不需要手动调用它
  • 哦,顺便说一句,你在你的应用构造函数中调用了InitializeComponent 吗?这通常很重要!
  • 感谢您的回复,但我希望它在尝试加载任何视图模型或视图之前运行一段代码。然后当我准备好调用它。这就是我尝试在代码中启动它的原因。
  • 配置/OnStartUp/StartRuntime/StartDesigntime 等引导程序虚拟方法的重点不就是这样吗?在CM打开根视图之前将代码放在那里进行配置

标签: wpf caliburn.micro


【解决方案1】:

使用Initialize() 方法代替Start()。我遇到了同样的错误并搜索了互联网,发现一个帖子说要改用Initialize()。我在 Caliburn.Micro 文档中的示例应用程序上进行了尝试,它对我有用。

【讨论】:

    【解决方案2】:

    这不是使用引导程序的“正确”方式,引导程序是您进行您所说的设置的地方。关键是要提供一个地方,Caliburn.Micro 知道你要设置。没有看到你的引导程序虽然不可能知道什么是错的。

    在调用 Configure 之后才会加载根 ViewModel。这是您的可扩展点。如果您需要进行复杂的配置,您可以在这里调用几个覆盖,然后派生一个公开这些方法的类。

    一般来说,虽然你需要提供更多关于你在做什么的信息,然后我才能给你一个具体的食谱。

    【讨论】:

    • 可能值得指向文档caliburnmicro.codeplex.com/…,它显示了自定义引导程序等 - 不知道为什么人们不经常阅读这些,因为 99% 的常见问题的答案都在文档中(它们是'结构不像参考,但所有信息都在那里)
    • 我们目前正在研究文档,以便对其进行整理,以使信息更易于查找。但是是的,文档中几乎包含所有这些好东西。 :)
    • 另外 - 如果您需要控制 CM 何时启动,您可以继承 BoostrapperBase,因为此基类在实例化时不会调用 Start
    • 需要帮忙吗?我很乐意做出贡献
    • 您最好在项目页面上询问。干杯。
    【解决方案3】:

    也许不是正确的方法(想从标记中删除它)但是,这段代码似乎工作......

    public partial class App : Application
    {
        MyBootstrapper _bootstrapper;
    
        protected override void OnStartup(StartupEventArgs e)
        {
            _bootstrapper = new MyBootstrapper();   
            base.OnStartup(e);
        }
    }
    
    public class MyBootstrapper : BootstrapperBase
    {
        public MyBootstrapper()
        {
            Start();
        }
    
        protected override void OnStartup(object sender, System.Windows.StartupEventArgs e)
        {
            DisplayRootViewFor<ShellViewModel>();
        }
    }
    

    【讨论】:

    • Caliburn.Micro at bootstrapper Start() 不存在。我正在使用从 BootstrapperBase 继承的最新版本。他们的示例运行时也没有出现相同的错误。我该怎么办?起点从何而来?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    • 2013-02-04
    • 2014-08-13
    • 2013-12-02
    • 2016-04-19
    • 1970-01-01
    相关资源
    最近更新 更多