簡體   English   中英

在WP7 UserControl中使用Caliburn會引發異常

[英]Using Caliburn in a WP7 UserControl throws exception

我正在嘗試使用控件內部的Caliburn Micro為Windows Phone應用程序構建UserControl。 引導程序通常是在應用程序資源中設置的

  <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的資源中使用,所以我不能保證任何良好或不良的行為。 引導程序應在應用程序資源中使用,也可以直接在代碼中實例化。 嘗試在InitializeComponent調用之后在用戶控件的ctor中創建它。

由於您在用戶控件上放置了引導程序,因此似乎PhoneApplicationService可能已被實例化-您是否嘗試過將boostrapper放在應用程序資源部分中?

CM源顯示啟動程序初始化時CM創建了PhoneApplicationService的新實例,並且看起來像問題一樣,您的應用程序的根必須已經創建了一個實例。

您是否有理由不能(在應用程序資源中)以標准方式使用boostrapper? 您的App.xaml是否包含PhoneApplicationService的初始化程序?

編輯:

出現錯誤的CM源在PrepareApplication 例如

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而是重新使用現有的:

    /// <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) { }
}

免責聲明:由於我從未為Windows Phone開發過軟件,因此不確定是否可以使用,但據我所知應該執行原始引導程序所執行的操作,但跳過應用程序和根框架的創建。 您只需要提供應用程序和根框架(或者,如果您可以從應用程序對象獲得根框架,則可能僅提供應用程序-就像我說的那樣,不知道有什么可能)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM