2009-12-28 16 views
1

J'ai quelques problèmes avec le contrôle ChildWindow, j'ai créé un contrôle de fenêtre d'erreur qui s'affiche après une exception non gérée dans app.xaml.cs. Le problème est lorsque j'essaie d'afficher la fenêtre d'erreur, parfois cela fonctionne bien, mais parfois je reçois cette exception désagréable:Silverlight ChildWindow: HRESULT E_FAIL sur ChildWindow.Show()

Message: Erreur HRESULT E_FAIL a été renvoyé à partir d'un appel à un composant COM.

Trace de pile: à MS.Internal.XcpImports.CheckHResult (UInt32 h) à MS.Internal.XcpImports.SetValue (INativeCoreTypeWrapper obj, propriété DependencyProperty, Boolean b) à System.Windows.DependencyObject.SetValue (propriété DependencyProperty, Boolean b) à System.Windows.Controls.Primitives.Popup.set_IsOpen (valeur booléenne) à System.Windows.Controls.ChildWindow.Show() à FrontEnd.SL.Util.GuiLogger.ShowErrorWindow (Détails ErrorDetails, gravité ErrorSeverity)

La trace que vous voyez est à l'intérieur de la méthode Show() de ChildWindow.


En d'autres termes, mon code est:
ErrorWindow errorWin = new ErrorWindow();
errorWin.Show();
où ErrorWindow: ChildWindow

toute aide est grandement appréciée ..

+0

Cela semble-t-il uniquement se produire lorsque l'exception non gérée d'origine est d'un certain type? –

Répondre

1

Il me semble que l'utilisation d'un contrôle ChildWindow va être sujettes à certains problèmes. Que se passe-t-il si le VisualTree en place est dans un état incohérent/cassé suite à l'exception? La meilleure chance de gérer une exception non gérée dans les limites de l'application serait de remplacer complètement l'objet existant détenu par VisualRoot.

+0

Bonjour Anthony, Vous avez raison, il semble que l'état de VisualTree a bien été rompu à la suite d'une erreur qui a été interceptée. Au lieu d'utiliser la méthode .Show() dans ces cas, j'ai besoin d'ajouter manuellement ChildWindow à RootVisual. Un peu d'un travail bâclé, mais que pouvez-vous faire: S – Boris

+0

+1, pourriez-vous expliquer pourquoi l'utilisation du contrôle ChildWindow est sujette à des problèmes? Merci! – VoodooChild

+0

@VoodooChild: La fenêtre enfant crée l'illusion d'être modale en créant un rectangle translucide qui couvre l'ensemble de la zone client de Sliverlight. Par conséquent, tous les déplacements de la souris après l'ouverture de Childwindow vont à la fenêtre enfant. Si un contrôle sous-jacent son état MouseOver entièrement sur des événements MouseEnter/MouseLeave et qu'une fenêtre enfant est lancée alors qu'il est dans l'état MouseOver, il n'obtiendra pas l'événement MouseLeave correspondant. Au moment où la fenêtre enfant est fermée, la souris n'est plus sur l'élément d'origine. – AnthonyWJones

0

Cela peut également se produire en cas de problème lors du chargement du contenu de la fenêtre enfant. Dans mon cas, j'avais spécifié différents espaces de noms dans le code-behind d'un usercontrol et son xaml, ce qui a provoqué cette erreur cryptique.