読者です 読者をやめる 読者になる 読者になる

Windows Phone 7のSilverlightアプリケーションでMicrosoft.XNA.Frameworkのイベントを拾おうとしてエラーが出たときは

Windows Phone 7のSilverlightアプリケーションでは、XNA Frameworkの一部のクラスも参照を追加することにより利用することができます。

ただし、XNA Frameworkからのイベントを受け取ろうとすると例外が発生します。XNA Framework側にTickを提供する必要があるかららしいのですが、ちょこっとコピペするだけで解決することができます。

1.XNAFrameworkDispatcherServiceを作る

クラスファイルを新規作成して、以下のクラスをコピペします

public class XNAFrameworkDispatcherService : IApplicationService
{
    DispatcherTimer frameworkDispatcherTimer;

    public XNAFrameworkDispatcherService()
    {
        frameworkDispatcherTimer = new DispatcherTimer();
        frameworkDispatcherTimer.Interval = TimeSpan.FromTicks(333333);
        frameworkDispatcherTimer.Tick += frameworkDispatcherTimer_Tick;
        FrameworkDispatcher.Update();
    }

    void frameworkDispatcherTimer_Tick(object sender, EventArgs e) 
    { 
        FrameworkDispatcher.Update();
    }

    #region IApplicationService メンバー

    void IApplicationService.StartService(ApplicationServiceContext context)
    {
        this.frameworkDispatcherTimer.Start();
    }

    void IApplicationService.StopService()
    {
        this.frameworkDispatcherTimer.Stop();
    }

    #endregion
}

2.App.xamlに2行書き足す

次に App.xaml を開いて、Applicationタグに以下の属性を追加します。

xmlns:s="clr-namespace:(プロジェクトの名前空間);assembly=(プロジェクトのアセンブリ名)"

次に、Application.ApplicationLifetimeObjects タグの中に、次の行を追加します。

<s:XNAFrameworkDispatcherService />

これで、XNA Frameworkのクラスが発行するイベントを受信しても例外落ちしなくなると思います。

*1:日本語ドキュメントが出てきてびっくりした