2009-09-27 4 views
0

Dans le cadre de l'apprentissage de wpf, je travaille sur des exemples d'applications MS 'lab'; L'exercice terminé semble correct, mais j'obtiens une exception NullReferenceException avec le problème "Code source indisponible" (détail de l'exception ci-dessous). Il semble être lancé après que la fenêtre principale soit affichée.wpf débogage xaml

Je soupçonne que le problème est dans le code XAML, mais le débogueur ne m'aide pas autant que je le voudrais. J'ai mis des points de rupture partout où le NavigationService est appelé dans le code, et aucun n'est touché avant que l'exception se produise. Le type renvoyé par la ou les fonction (s) de page a été changé de chaîne en objet dans le cadre de l'exercice.

Dans un vrai projet. il y aurait probablement assez de tests unitaires et de contrôles en place pour ne pas être dans cet état, mais aussi longtemps que je le ferai et dans le cadre de l'exercice d'apprentissage wpf, ça ne peut sûrement pas faire de mal de savoir déboguer mieux!

Comment est-ce que je peux déboguer quelque chose comme ceci mieux?

< --- EDITED COMMENTAIRES

@electronherder

Le plus proche suppose que je peux faire est qu'il ya un cadre dans Window1 qui n'est pas accroché correctement. L'idée est que le cadre affiche les informations de contact sur le contact actuellement sélectionné dans un ListBox; cela se fait dans le code comme suit:

void ListItemSelected(object sender, SelectionChangedEventArgs args) { 
     // show first page function on the right hand side frame 
     var pageFunction = new ContactDetailPage1(false, lstBoxAllContacts.SelectedIndex); 
     pageFunction.Return += pageFunction0_Return; 
     Frame_RightPane.Navigate(pageFunction); 

     //update status bar 
     if (lstBoxAllContacts.SelectedItem != null) { 
      var contact = lstBoxAllContacts.SelectedItem as Contact; 
      statusBar.Text = contact.FirstName + " " + contact.LastName; 
     } 
     else { 
      statusBar.Text = "No contacts on file."; 
     } 
    } 

Avant Window1 quitte l'appel Show(), cette méthode exécute sans se briser. Il a cet appel pour faire un peu de navigation, que je ne comprends pas complètement mais qui est copié des notes d'exercice de laboratoire. La navigation est liée à une fenêtre différente appelée ContactDetailPage1, et voici comment les notes de laboratoire expliquent les choses:

"Nous voulons être en mesure d'afficher cette page dans deux modes: Lire et Editer. De cette façon, nous pouvons réutiliser le mode Lecture dans le cadre des détails du contact, Frame_RightPane. "

Le branchement d'événement (pageFunction.Return + = pageFunction0_Return;) est également un peu suspect, car il est intentionnellement interdit de maintenir le compilateur heureux. Je mets un assert l'intérieur cependant, comme vous pouvez le voir dans le code ci-dessous:

// This is the ContactDetailPage1 page function's return handler; merely a placeholder 
    // since the page is displayed in read mode and doesn't return anything. 
    private static void pageFunction0_Return(object sender, ReturnEventArgs<object> e) { 
     Debug.Assert(false, "We should never actually be here!"); 
    } 

Enfin, voici le XAML de Window1 qui couvre le cadre:

<!-- RHS Panel --> 
    <Frame Name="Frame_RightPane" Grid.Column="0" Grid.ColumnSpan="1" Grid.Row="0" Grid.RowSpan="1" 
     Margin="201,65,0,0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="Auto"/> 

C'est le meilleur que je peux faire ici, mais voici le lien vers le laboratoire pour quiconque veut vraiment le comprendre (http://windowsclient.net/downloads/folders/hands-on-labs/entry3719.aspx).

< --- FIN DE EDIT --->

Cheers,
Berryl

< - exception ->

System.NullReferenceException was unhandled 
Message="Object reference not set to an instance of an object." Source="mscorlib" 
StackTrace: 
    at System.Object.GetType() 
    at MS.Internal.AppModel.ReturnEventSaver._Detach(PageFunctionBase pf) 
    at System.Windows.Navigation.NavigationService.HookupNewTree(Object newTree, NavigateInfo navInfo, Uri newUri) 
    at System.Windows.Navigation.NavigationService.OnBeforeSwitchContent(Object newBP, NavigateInfo navInfo, Uri newUri) 
    at System.Windows.Navigation.NavigationService.MS.Internal.AppModel.IContentContainer.OnContentReady(ContentType contentType, Object bp, Uri bpu, Object navState) 
    at System.Windows.Navigation.NavigationService.DoNavigate(Object bp, NavigationMode navFlags, Object navState) 
    at System.Windows.Navigation.NavigateQueueItem.Dispatch(Object obj) 
    at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Boolean isSingleParameter) 
    at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler) 
    at System.Windows.Threading.DispatcherOperation.InvokeImpl() 
    at System.Threading.ExecutionContext.runTryCode(Object userData) 
    at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Windows.Threading.DispatcherOperation.Invoke() 
    at System.Windows.Threading.Dispatcher.ProcessQueue() 
    at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
    at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
    at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o) 
    at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Boolean isSingleParameter) 
    at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler) 
    at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Boolean isSingleParameter) 
    at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) 
    at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg) 
    at System.Windows.Threading.Dispatcher.TranslateAndDispatchMessage(MSG& msg) 
    at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame) 
    at System.Windows.Application.RunInternal(Window window) 
    at AddressBook.MyApp.Main() in C:\Users\Berryl\Documents\Visual Studio 2008\Projects\UI related\DEV007 Building WPF Applications\Source\CS\Ex1\Task1\AddressBook\obj\Debug\MyApp.g.cs:line 0 
    at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) 
    at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Threading.ThreadHelper.ThreadStart() 

InnerException:

+0

L'exemple est assez ancien - 05-09-2007 - et si vous utilisez VS 2008 SP1, il se peut qu'il y ait des changements dans .NET 3.5 SP1 qui peuvent avoir modifié le comportement de la bibliothèque. WPF, comme WinForms, s'exécute sur des threads séparés, de sorte que le thread principal de l'explorateur STA n'est pas bloqué. Il peut donc être difficile de passer au travers des échecs, en particulier avec un langage déclaratif tel que XAML. Je vous recommande de commenter ce que vous pensez être le XAML problématique et de le voir s'il est généré et exécuté sans lui. Si cela fonctionne, essayez d'ajouter la fonctionnalité. HTH – jnoss

Répondre

0

Avez-vous renommer l'une des classes - comme Window1.xaml? J'ai vu des échecs similaires dans des projets WPF quand j'ai renommé la classe de fenêtre et j'ai manqué quelques références. Ils sont un certain nombre d'entre eux dans le projet en code généré.Si vous recherchez l'ancien nom dans l'ensemble du projet, vous devriez être en mesure de trouver les références orphelines qui pourraient causer l'erreur.

+0

Cela ressemble au genre de chose que je cherche, mais cela ne semble pas être le cas ici. – Berryl

+0

WPF génère automatiquement beaucoup de C# lors de la compilation - le code MyApp.g.cs dans la pile d'appel ci-dessus est généré par WPF. La classe MS.Win32 est un code natif (C++) qui, d'après mon expérience, ne produit pas de très bons messages d'erreur. Il pourrait être utile de fournir plus d'informations sur ce que vous essayez de faire. – jnoss

Questions connexes