7
votes

Comment puis-je nier des éléments XAML personnalisés?

x:Name="SecondElementName"  

0 commentaires

3 Réponses :


1
votes

Si vous en voulez un dans l'autre, vous voudriez mettre le INTERNE dans la propriété Contenu de la première:

<local:ElementType x:Name="FirstElementName">
    <local:ElementType.Content>
        <local:ElementType x:Name="SecondElementName" Grid.Column="1" Grid.Row="1" />
    </local:ElementType.Content>
</local:ElementType>


2 commentaires

On dirait que ceci est la bonne direction à se diriger. En ce qui concerne votre sentance finale: ha! J'ai délibérément laissé quelque chose qui donnerait les détails --- Croyez-moi, vous ne voulez pas savoir. En ce qui concerne votre solution, je reçois une erreur: "Le contenu de la propriété attachable 'n'a pas été trouvé dans le type" ElementType "" J'ai essayé "Grid.content" à sa place et je reçois à peu près la même erreur. Des idées supplémentaires?


Je voulais dire des "enfants", pas de contenu. On dirait que tu l'as eu, cependant.



7
votes

Afin de savoir quoi faire avec des objets de balisage imbriqués, l'analyseur XAML examinera, entre autres, si la classe .NET définit une propriété «Contenu» par défaut à utiliser comme conteneur pour ces enfants. Ceci est fait avec le "contentpropertyattribute".

Dans votre cas, car je suppose que vous voulez que des objets imbriqués se rendent à l'intérieur de la grille et que les enfants d'une grille vont dans la collection de propriétés "enfants", vous devez juste avoir besoin de faire ce qui suit: p> xxx pré>

Si vous devez faire une logique lorsque vous ajoutez des enfants à votre contrôle (par exemple, permettez uniquement à certains types d'enfants de votre contrôle élémentaire), vous pouvez plutôt hériter D'IADDChild, et mettez en œuvre les méthodes AddChild et AddText. P>

Quant au problème de nommage, il semble que seuls les contrôles impressionnants puissent avoir nommé des enfants dans une portée instanciée. Donc, fondamentalement, vous pouvez avoir des enfants nommés à l'intérieur de l'élémentaireType.xaml, mais pas nommés enfants dans d'autres balises où vous instanciez l'élémentaire. Je suppose que c'est à cause de la façon dont ils optimisent l'arbre logique ou quelque chose. Un contrôle imperméable, d'autre part, est un contrôle avec un seul code. Donc, si vous tournez votre classe en une seule sous-classe vide de grille vide, cela fonctionne: P>

public class ElementType : Grid
{
}


2 commentaires

Ceci est également intéressant, mais cela ne me permet toujours pas de donner au parent et à l'enfant que l'élément de type pseudonype est des noms différents. Est-ce que quelqu'un sait comment je peux les obtenir nommé séparément les uns des autres?


Oh ouais, désolé ... je vais compléter ma réponse ci-dessus.



0
votes

Si vous ne voulez pas changer d'UserControl, utilisez un comportement ci-joint. Donc, vous en avez simplement besoin là-bas, où la compilée XAML a échoué! Seulement 1 comportement pour chaque UserControl qui fait des problèmes.

in xaml: p> xxx pré>

in c #: p>

  public class UserControlNameBehavior : Behavior<UserControl>
    {
        public string Name { get; set; }

        protected override void OnAttached()
        {
            this.AssociatedObject.Loaded += OnLoaded;
            base.OnAttached();
        }

        private void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
        {
            this.AssociatedObject.Name = this.Name;
        }
    }


1 commentaires

Quelle est la classe de comportement? Qu'est-ce que je :?