【问题标题】:Add XNA to Silverlight WP7 project将 XNA 添加到 Silverlight WP7 项目
【发布时间】:2012-02-27 14:24:34
【问题描述】:

我目前正在为 WP7 制作一款游戏,该游戏主要使用 Silverlight 制作。但现在我需要一个可以使用 XNA 的页面。 XNA 页面将接收战斗数据,然后将其可视化为用户。

我尝试在我的解决方案中创建一个“Windows Phone Silverlight 和 XNA”项目(BattleSimulator)并导航到 GamePage.xaml。但我在 (Application.Current as App) 上收到 NullReferenceException 和警告。警告在 BattleSimulator 项目中。

警告

Warning 1   The project 'BattleSimulatorLib' cannot be referenced.  The referenced project is targeted to a different framework family (.NETFramework)  

代码

 public GamePage()
    {
        InitializeComponent();

        // Get the content manager from the application
        contentManager = (Application.Current as App).Content; //NullReference here

堆栈跟踪

   at BattleSimulator.GamePage..ctor()
   at System.Reflection.RuntimeConstructorInfo.InternalInvoke(RuntimeConstructorInfo rtci, BindingFlags invokeAttr, Binder binder, Object parameters, CultureInfo culture, Boolean isBinderDefault, Assembly caller, Boolean verifyAccess, StackCrawlMark& stackMark)
   at System.Reflection.RuntimeConstructorInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, StackCrawlMark& stackMark)
   at System.Activator.InternalCreateInstance(Type type, Boolean nonPublic, StackCrawlMark& stackMark)
   at System.Activator.CreateInstance(Type type)
   at System.Windows.Navigation.PageResourceContentLoader.BeginLoad_OnUIThread(AsyncCallback userCallback, PageResourceContentLoaderAsyncResult result)
   at System.Windows.Navigation.PageResourceContentLoader.<>c__DisplayClass4.<BeginLoad>b__0(Object args)
   at System.Reflection.RuntimeMethodInfo.InternalInvoke(RuntimeMethodInfo rtmi, Object obj, BindingFlags invokeAttr, Binder binder, Object parameters, CultureInfo culture, Boolean isBinderDefault, Assembly caller, Boolean verifyAccess, StackCrawlMark& stackMark)
   at System.Reflection.RuntimeMethodInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, StackCrawlMark& stackMark)
   at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
   at System.Delegate.DynamicInvokeOne(Object[] args)
   at System.MulticastDelegate.DynamicInvokeImpl(Object[] args)
   at System.Delegate.DynamicInvoke(Object[] args)
   at System.Windows.Threading.DispatcherOperation.Invoke()
   at System.Windows.Threading.Dispatcher.Dispatch(DispatcherPriority priority)
   at System.Windows.Threading.Dispatcher.OnInvoke(Object context)
   at System.Windows.Hosting.CallbackCookie.Invoke(Object[] args)
   at System.Windows.Hosting.DelegateWrapper.InternalInvoke(Object[] args)
   at System.Windows.RuntimeHost.ManagedHost.InvokeDelegate(IntPtr pHandle, Int32 nParamCount, ScriptParam[] pParams, ScriptParam& pResult)

解决这个问题的一种方法是将我所有的 silverlight 类和标记复制到一个新的 SL 和 XNA 项目中,但这是我的 if-all-else-fails 计划。

有谁知道如何解决这个 NullReferenceException 或警告?还是我应该尝试以其他方式做到这一点?

编辑:在此处找到有关警告的信息:http://forums.create.msdn.com/forums/p/93769/561676.aspx 它是无害的。

【问题讨论】:

    标签: silverlight windows-phone-7 xna nullreferenceexception


    【解决方案1】:

    空引用很可能是as 运算符未能将类型转换为App,当您尝试在as 的结果上查找Content 属性时,这将导致您出现NullReferenceException。

    对于 SL/XNA 项目,在应用程序全局级别定义了一些额外的东西,以及您的 App 对象中的一些额外样板代码。这些是 SL/XNA 特定的,不是为纯 SL 项目定义的。对于 SL/XNA 项目,还需要一些对 XNA 类库的额外项目引用。

    如果您仔细研究标准 SL 和 SL/XNA 基本应用程序项目之间的差异,可以手动将此额外代码添加到现有 SL 项目中,但在您的情况下,创建新的 SL/XNA 可能更容易项目并将您的代码移入其中。

    例如一些补充是(这不包括额外的样板代码,所以请自己检查)

    来自 App.xaml:

    <!--The SharedGraphicsDeviceManager is used to render with the XNA Graphics APIs-->
    <xna:SharedGraphicsDeviceManager />
    

    来自 App.xaml.cs:

        /// <summary>
        /// Provides access to a ContentManager for the application.
        /// </summary>
        public ContentManager Content { get; private set; }
    
        /// <summary>
        /// Provides access to a GameTimer that is set up to pump the FrameworkDispatcher.
        /// </summary>
        public GameTimer FrameworkDispatcherTimer { get; private set; }
    
        /// <summary>
        /// Provides access to the AppServiceProvider for the application.
        /// </summary>
        public AppServiceProvider Services { get; private set; }
    

    【讨论】:

    • 感谢您的回答。开始研究它,但它似乎有点麻烦,我认为风险在于我最终会得到一些不稳定的东西。我将拿起鼠标并开始导入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多