Windows phone 7 在WP7 UserControl中使用Caliburn会引发异常

Windows phone 7 在WP7 UserControl中使用Caliburn会引发异常,windows-phone-7,caliburn.micro,Windows Phone 7,Caliburn.micro,我正在尝试使用控件中的Caliburn Micro为Windows Phone应用程序构建用户控件。引导程序通常在应用程序资源中设置 <Application.Resources> <local:AppBootstrapper x:Key="bootstrapper" /> </Application.Resources> 我尝试在用户控件的Xaml中执行此操作 <UserControl.Resources> &

我正在尝试使用控件中的Caliburn Micro为Windows Phone应用程序构建用户控件。引导程序通常在应用程序资源中设置

  <Application.Resources>
     <local:AppBootstrapper x:Key="bootstrapper" />
  </Application.Resources>

我尝试在用户控件的Xaml中执行此操作

 <UserControl.Resources>
     <local:AppBootstrapper x:Key="bootstrapper" />
 </UserControl.Resources>

但在加载组件时,这会在初始化期间引发异常。LoadComponent调用引发异常:“Microsoft.Phone.ni.dll中发生了类型为'System.InvalidOperationException'的第一次意外异常”


引导程序应该在何时何地初始化?

它不用于UserControl的资源,因此我不能保证任何好的或坏的行为。引导程序应该在应用程序资源中使用,或者您可以直接在代码中实例化它。尝试在用户控件的ctor中创建它,就在InitializeComponent调用之后。

因为您正在用户控件上放置引导程序,所以
PhoneApplicationService
可能已经实例化了-您尝试过将引导程序放在应用程序资源部分吗

CM源代码显示,CM在引导程序初始化时创建了一个新的
PhoneApplicationService
实例,这看起来像是问题所在,应用程序的根必须已经创建了一个实例

有没有理由不能以标准方式使用boostrapper(应用程序内资源)?您的App.xaml是否包含
PhoneApplicationService
的初始化器

编辑:

获取错误的CM源位于
PrepareApplication
中。e、 g

protected override void PrepareApplication() {
        base.PrepareApplication();

            phoneService = new PhoneApplicationService();
            phoneService.Activated += OnActivate;
            phoneService.Deactivated += OnDeactivate;
            phoneService.Launching += OnLaunch;
            phoneService.Closing += OnClose;

            Application.ApplicationLifetimeObjects.Add(phoneService);

            if (phoneApplicationInitialized) {
                return;
            }

            RootFrame = CreatePhoneApplicationFrame();
            RootFrame.Navigated += OnNavigated;

            phoneApplicationInitialized = true;
        }
您可能只需将其子类化,而不用创建新的PhoneApplicationService,而是重用现有的PhoneApplicationService:

    /// <summary>
    /// A custom bootstrapper designed to setup phone applications.
    /// </summary>
    public class CustomPhoneBootstrapper : Bootstrapper {
    bool phoneApplicationInitialized;
    PhoneApplicationService phoneService;

    /// <summary>
    /// The root frame used for navigation.
    /// </summary>
    public PhoneApplicationFrame RootFrame { get; private set; }

    /// <summary>
    /// Provides an opportunity to hook into the application object.
    /// </summary>
    protected override void PrepareApplication(PhoneApplicationService phoneAppService, PhoneApplicationFrame rootFrame) {
        base.PrepareApplication();

        phoneService = phoneAppService;
        phoneService.Activated += OnActivate;
        phoneService.Deactivated += OnDeactivate;
        phoneService.Launching += OnLaunch;
        phoneService.Closing += OnClose;

        Application.ApplicationLifetimeObjects.Add(phoneService);

        if (phoneApplicationInitialized) {
            return;
        }

        RootFrame = rootFrame;
        RootFrame.Navigated += OnNavigated;

        phoneApplicationInitialized = true;
    }

    void OnNavigated(object sender, NavigationEventArgs e) {
        if (Application.RootVisual != RootFrame) {
            Application.RootVisual = RootFrame;
        }
    }

    /// <summary>
    /// Occurs when a fresh instance of the application is launching.
    /// </summary>
    protected virtual void OnLaunch(object sender, LaunchingEventArgs e) { }

    /// <summary>
    /// Occurs when a previously tombstoned or paused application is resurrected/resumed.
    /// </summary>
    protected virtual void OnActivate(object sender, ActivatedEventArgs e) { }

    /// <summary>
    /// Occurs when the application is being tombstoned or paused.
    /// </summary>
    protected virtual void OnDeactivate(object sender, DeactivatedEventArgs e) { }

    /// <summary>
    /// Occurs when the application is closing.
    /// </summary>
    protected virtual void OnClose(object sender, ClosingEventArgs e) { }
}
//
///设计用于设置电话应用程序的自定义引导程序。
/// 
公共类CustomPhoneBootstrapper:Bootstrapper{
bool电话应用程序初始化;
电话应用服务电话服务;
/// 
///用于导航的根框架。
/// 
公用电话应用程序框架根框架{get;private set;}
/// 
///提供连接到应用程序对象的机会。
/// 
受保护的覆盖void PrepareApplication(PhoneApplicationService phoneAppService,PhoneApplicationFrame根框架){
base.PrepareApplication();
phoneService=phoneAppService;
phoneService.Activated+=OnActivate;
phoneService.Deactivated+=OnDeactivate;
phoneService.Launching+=OnLaunch;
phoneService.Closing+=OnClose;
Application.ApplicationLifetimeObjects.Add(电话服务);
如果(电话应用程序初始化){
返回;
}
RootFrame=RootFrame;
RootFrame.Navigated+=OnNavigated;
phoneApplicationInitialized=true;
}
已导航无效(对象发送方,NavigationEventArgs e){
if(Application.RootVisual!=RootFrame){
Application.RootVisual=RootFrame;
}
}
/// 
///在启动应用程序的新实例时发生。
/// 
受保护的虚拟void OnLaunch(对象发送方,LaunchingEventArgs e){}
/// 
///当以前的已坟墓或暂停的应用程序被重新恢复/恢复时发生。
/// 
受保护的虚拟void OnActivate(对象发送方,ActivateDevenTarget e){}
/// 
///在应用程序被删除或暂停时发生。
/// 
受保护的虚拟空OnDeactivate(对象发送方,已停用EventTarget e){}
/// 
///在应用程序关闭时发生。
/// 
受保护的虚拟void OnClose(对象发送方,ClosingEventArgs e){}
}

免责声明:由于我从未为Windows Phone开发过设备,因此不确定这些功能是否有效,但据我所知,这些功能应该与原始引导程序相同,只是跳过了应用程序和根框架的创建。您只需要提供应用程序和根框架(或者,如果您可以从应用程序对象获取根框架,则可能只提供应用程序-如我所说,不知道可能发生什么)

我尝试了AppBootstrapper bootstrapper=new AppBootstrapper();在控件的已加载事件中,但它抛出相同的异常。内部异常是什么?异常堆栈的底部是什么?异常是:“System.InvalidOperationException:不支持创建PhoneApplicationService的多个实例。\r\n位于Microsoft.Phone.Shell.PhoneApplicationService..ctor()\r\n位于Caliburn.Micro.PhoneBootstrapper.PrepareApplication()\r\n位于Caliburn.Micro.BootstrapperBase.StartRuntime()\r\n在Caliburn.Micro.Bootstrapper.base.Start()\r\n在Caliburn.Micro.Bootstrapper..ctor(布尔使用应用程序)\r\n在Caliburn.Micro.PhoneBootstrapper..ctor()\r\n在CloudStorage.AppBootstrapper..ctor()\r\n在CloudStorage.UIControl.UI\u加载(对象发送方,路由目标)在WP7应用程序中,usercontrol没有app.xaml。我不能将引导程序放在应用程序中,因为usercontrol应该独立于使用它的应用程序。通常,这些应用程序都有自己的PhoneApplicationService。所以我假设它不会工作?boostrapper所做的只是初始化你的应用程序-如果你不需要初始化应用程序,那么可能有其他方法让CM在不尝试重新初始化应用程序的情况下将其约定应用到你的UC。最简单的方法可能是对CM源代码进行DL,并对代码进行一个小的修改。我将在我的回答中发布详细信息。我已经添加了一个答案-由于PhoneBootstrapper是公共的,您可以对其进行子类化,并稍微更改发生的事情(而不是创建一个新的PhoneApp类,只需使用现有的一个,让CM执行其挂钩等)。虽然我不确定
框架
参考,但请试一试