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:
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