0

コントロール内でCaliburnMicroを使用して、WindowsPhoneアプリ用のUserControlを構築しようとしています。ブートストラッパーは通常、アプリリソースで設定されます

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

ユーザーコントロールのXamlでこれを実行しようとしています。

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

ただし、これにより、コンポーネントがロードされる初期化中に例外がスローされます。LoadComponent呼び出しは、例外をスローします:「タイプ'System.InvalidOperationException'の最初のチャンスの例外がMicrosoft.Phone.ni.dllで発生しました」

ブートストラッパーはいつどこで初期化する必要がありますか?

4

2 に答える 2

0

UserControlにブートストラッパーを配置しているので、PhoneApplicationServiceおそらくすでにインスタンス化されているようです-ブーストラッパーをアプリリソースセクションに配置してみましたか?

CMソースはPhoneApplicationService、ブートストラッパーが初期化するときにCMが新しいインスタンスを作成することを示しています。これは問題のように見えますが、アプリケーションのルートはすでにインスタンスを作成している必要があります。

(アプリリソースで)標準的な方法でブーストラッパーを使用できない理由はありますか?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を作成せずに、既存の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を開発したことがないので、これが機能するかどうかはわかりませんが、元のブートストラッパーが実行したことを実行する必要がありますが、アプリケーションとルートフレームの作成をスキップします。アプリとルートフレームを提供する必要があります(または、アプリケーションオブジェクトからルートフレームを取得できる場合はアプリだけです-私が言ったように、何が可能かわかりません)

于 2012-12-20T09:43:21.080 に答える
0

UserControlのリソースで使用することを意図していないため、良い動作または悪い動作を保証することはできません。ブートストラッパーはアプリケーションリソースで使用する必要があります。または、コードで直接インスタンス化することもできます。InitializeComponent呼び出しの直後に、ユーザーコントロールのコンストラクターで作成してみてください。

于 2012-12-19T17:59:04.553 に答える