2008-10-23 7 views
0

Je parfois obtenir l'exception suivante pour un contrôle personnalisé de la mine:XamlParseException: attribut dans le contrôle personnalisé manquant, mais il est défini!

XamlParseException occurredUnknown attribute Points in element SectionClickableArea [Line: 10 Position 16]

La trace de la pile:

{System.Windows.Markup.XamlParseException: Unknown attribute Points on element SectionClickableArea. [Line: 10 Position: 16] 
    at System.Windows.Application.LoadComponent(Object component, Uri resourceLocator) 
    at SomeMainDialog.InitializeComponent() 
    at SomeMainDialog..ctor()} 

La déclaration d'élément où cela se produit ressemble à ceci (le gestionnaire d'événement référencé ici est défini, bien sûr):

<l:SectionClickableArea x:Name="SomeButton" 
    Points="528,350, 508,265, 520,195, 515,190, 517,165, 530,120, 555,75, 570,61, 580,60, 600,66, 615,80, 617,335, 588,395, 550,385, 540,390, 525,393, 520,385" 
    Click="SomeButton_Click"/> 

Cela fait partie du code de SectionClickableArea:

public partial class SectionClickableArea : Button { 

    public static readonly DependencyProperty PointsProperty 
     = DependencyProperty.Register("Points", typeof(PointCollection), typeof(SectionClickableArea), 
      new PropertyMetadata((s, e) => { 
       SectionClickableArea area = (SectionClickableArea) s; 
       area.areaInfo.Points = (PointCollection) e.NewValue; 
       area.UpdateLabelPosition(); 
      })); 
    public PointCollection Points { 
     get { return (PointCollection) GetValue(PointsProperty); } 
     set { SetValue(PointsProperty, value); } 
    } 

J'utilise cette commande pour quelque chose comme un bouton en forme de polygone. Par conséquent, je hérite du bouton. J'ai eu des problèmes similaires (E_AG_BAD_PROPERTY_VALUE sur un autre DependencyProperty de type chaîne, selon la ligne et la colonne donnée, etc) avec ce contrôle pendant des semaines, mais je n'ai absolument aucune idée pourquoi.


Une autre exception pour le même contrôle a eu lieu ce matin pour un autre utilisateur (extrait d'un journal et traduit de l'allemand):

Type: System.InvalidCastException Message: The object of type System.Windows.Controls.ContentControl could not be converted to type [...]SectionClickableArea. at SomeOtherMainDialog.InitializeComponent() 
    at SomeOtherMainDialog..ctor() 

Exception interne:

Type: System.Exception Message: An HRESULT E_FAIL error was returned when calling COM component at MS.Internal.XcpImports.CheckHResult(UInt32 hr) 
    at MS.Internal.XcpImports.SetValue(INativeCoreTypeWrapper obj, DependencyProperty property, DependencyObject doh) 
    at MS.Internal.XcpImports.SetValue(INativeCoreTypeWrapper doh, DependencyProperty property, Object obj) 
    at System.Windows.DependencyObject.SetObjectValueToCore(DependencyProperty dp, Object value) 
    at System.Windows.DependencyObject.SetValueInternal(DependencyProperty dp, Object value, Boolean allowReadOnlySet, Boolean isSetByStyle, Boolean isSetByBuiltInStyle) 
    at System.Windows.DependencyObject.SetValueInternal(DependencyProperty dp, Object value) 
    at System.Windows.DependencyObject.SetValue(DependencyProperty dp, Object value) 
    at System.Windows.Controls.Control.set_DefaultStyleKey(Object value) 
    at System.Windows.Controls.ContentControl..ctor() 
    at System.Windows.CoreTypes.GetCoreWrapper(Int32 typeId) 
    at MS.Internal.ManagedPeerTable.EnsureManagedPeer(IntPtr unmanagedPointer, Int32 typeIndex, Type type, Boolean preserveManagedObjectReference) 
    at MS.Internal.ManagedPeerTable.EnsureManagedPeer(IntPtr unmanagedPointer, Int32 typeIndex, Type type) 
    at MS.Internal.ManagedPeerTable.GetManagedPeer(IntPtr nativeObject) 
    at MS.Internal.FrameworkCallbacks.SetPropertyAttribute(IntPtr nativeTarget, String attrName, String attrValue, String attachedDPOwnerNamespace, String attachedDPOwnerAssembly) 

Toutes les idées c'est mal avec le contrôle, ou ce que je peux faire pour trouver la source de ces exceptions? Comme je l'ai dit, ces problèmes se produisent seulement toutes les quelques dizaines de fois le contrôle est instancié.

+1

Puisque c'est maintenant une question populaire, je voulais faire un suivi: Dans ce cas, nous n'avons jamais trouvé le problème. Cela fait pas mal de temps que je travaillais dessus, mais je pense qu'un membre de l'équipe l'a "résolu" en appelant le constructeur de l'objet pour le nœud racine XAML dans une boucle, en répétant jusqu'à ce qu'aucune exception ne soit levée. –

Répondre

0

Je ne suis pas un expert XAML mais vous manque un espace de noms sur les points (par exemple l: Points)?

0

Je pense que nous voyons le même problème. Je reçois l'exception invalidcast plus souvent. Quand, par des commentaires aveugles, je peux supprimer l'invalide, il arrive parfois que l'attribut manque une erreur pour un attribut qui est, en fait, là. Avez-vous trouvé une solution? BTW: le moyen le plus facile de le reprocher est de simplement charger l'application fautive et appuyer plusieurs fois sur F5 pour actualiser la page. Vous l'obtiendrez finalement.

J'ai également vu une InvalidOperationException intermittent qui est à travers de DependencyObject.get_NativeObject().

voir ma question ici SO: Intermittent InavlidCastException in a UserControl.InitializeComponent()

Voir mon bug silverlight.net rapport ici: http://silverlight.net/forums/t/67732.aspx

1

Je suis aussi tombé sur cette question. Je n'ai pas une bonne explication pour cela (semble être XAML bug d'analyse syntaxique), mais je l'ai résolu en ajoutant le code suivant à XAML:

<UserControl.Resources> 
    <customNamespace:InheritedControl x:Name="dummyInstance"/> 
</UserControl.Resources> 
0

J'ai eu le même problème. Dans mon cas, l'erreur était sur l'un des membres. Une exception a été levée sur le constructeur des membres.
Je l'ai résolu en mettant breakpoint avant la méthode InitializeComponent() et en mode de débogage pressé F11 à Step Into et trouvé l'erreur.
Espérons que cela aidera.
Merci.

+0

Il y avait certainement une exception, voir mon commentaire à l'article original. Mais c'était assez aléatoire, comme vous pouvez le dire par notre "solution" à la question. Merci néanmoins pour l'info. –