2017-05-24 2 views
0

J'ai un problème en essayant d'implémenter ce code en DSL.Est-ce que quelqu'un a rencontré une exception stackoverflow lors de la mise à jour de TextDecorators dans InitializeDecorators dans DSL?

protected override void InitializeDecorators(IList<ShapeField> shapeFields, IList<Decorator> decorators) 
    { 
     base.InitializeDecorators(shapeFields, decorators); 

     var nameField = (TextField)ShapeElement.FindShapeField(shapeFields, "NameDecorator"); 

     if (nameField != null) 
     { 
      nameField.DefaultMultipleLine = true; 
      nameField.DefaultAutoSize = false; 

      nameField.AnchoringBehavior.Clear(); 
      nameField.AnchoringBehavior.SetLeftAnchor(AnchoringBehavior.Edge.Left, 0); 
      nameField.AnchoringBehavior.SetRightAnchor(AnchoringBehavior.Edge.Right, 0); 
      nameField.AnchoringBehavior.SetTopAnchor(nameField, AnchoringBehavior.Edge.Top, 0); 
      nameField.AnchoringBehavior.SetBottomAnchor(AnchoringBehavior.Edge.Bottom, 0); 
     } 
    } 

Ceci est essentiellement copié et collé à partir des documents Microsoft situés ici:

ShapeField.AnchoringBehavior Property

Je l'ai essayé à la fois dans ma solution et la version minimale fournie comme modèle dans Visual Studio, sans autre personnalisation sauf pour inclure le code ci-dessus.

Il semble se produire dans le code généré dans DomainClasses.cs dans la classe NamePropertyHandler suivant la méthode suivante sur le retour:

/// <summary> 
     /// Gets a strongly-typed value of the property on specified element. 
     /// </summary> 
     /// <param name="element">Element which owns the property.</param> 
     /// <returns>Property value.</returns> 
     public override sealed global::System.String GetValue(BaseActivityBase element) 
     { 
      if (element == null) throw new global::System.ArgumentNullException("element"); 
      return element.namePropertyStorage; 
     } 

Je suis perplexe et que ce qui se passe à la fois la version linguistique minimale et la mienne, j'ai le sentiment que quelque chose de plus grand se passe.

Est-ce que quelqu'un d'autre a eu des problèmes avec ceci, et a peut-être une solution de contournement ou quelque chose?

+1

Une différence essentielle entre l'exemple que vous avez lié et votre code est que l'exemple semble fonctionner avec deux champs distincts. Dans votre cas, vous essayez de travailler avec un seul champ. Ce qui me fait penser que 'nameField.AnchoringBehavior.SetTopAnchor (nameField, AnchoringBehavior.Edge.Top, 0);' va être impliqué quelque part ici. –

+0

Vous savez ce que merci Damien Je pense que l'utilisation de la surcharge en passant le nom de domaine dans le comportement d'ancrage est la cause, je n'ai pas remarqué cela, agréable d'avoir une autre paire d'yeux ... Je vais le regarder et revenir – Lyon

Répondre

0

Le problème était dans ma stupidité de pâte de copie ... la surcharge où je passais le nom causait un problème récursif.

nameField.AnchoringBehavior.SetTopAnchor(nameField, AnchoringBehavior.Edge.Top, 0); 

et devrait être

nameField.AnchoringBehavior.SetTopAnchor(AnchoringBehavior.Edge.Top, 0);