6
votes

Wpf réelwidth est zéro

J'ai un contrôle utilisateur qui a un canvas de hauteur 100 et de largeur 1920.

au chargement de la commande, je vais à une source externe, téléchargez un fichier texte et ajoutez < Code> TextBlock S à la toile. Ensuite, je souhaite créer un effet de défilement de chapiteur qui devrait fonctionner simplement bien, sauf après avoir ajouté le texte S sur la toile , j'ai besoin d'obtenir leur largeur à des fins de calcul mais La propriété réelWidth est toujours zéro.

Voici un code: xxx


1 commentaires

TEXTBLOCK n'est pas visible et n'est pas chargé, il n'a donc pas de propriétaire réelWidth. J'ai résolu un problème similaire avec les articlesControl, mais je ne suis pas sûr de la toile. Essayez des événements comme layoueuvre, sizechanged et ainsi de suite.


4 Réponses :


2
votes

Tout Contrôle 'S actuelHeight ou réelWidth sera toujours zéro avant de ne pas être chargé > > Mesurée > arrangé > rendu .

Dans votre cas, je vous recommande d'utiliser chargé ou SIZCHANGED de ce textblock à votre avantage.


3 commentaires

Il y a beaucoup de textes de texte cependant, je devrais vous abonner à l'événement chargé de la dernière fois ajouté, ce qui semble être un peu de hack, ne pensez-vous pas?


Je suppose que tu as raison! Sauf si vous ajoutez ces textblock dans un stackpanel avec horizontal orientation et faites défiler ce panneau. Dans ce cas, vous devriez faire face à cet événement SEUL uniquement.


Un contrôle est rendu d'abord avant que son événement chargé soit appelé.



0
votes

Y a-t-il une raison particulière pour utiliser Canvas pour la mise en page du texte textblock s? Sinon, vous feriez mieux d'utiliser un StackPanel avec une orientation horizontale, il gérera la mise en page Math pour vous.


1 commentaires

Je fais un effet de chapiteau défilant, ce qui signifie que chaque élément doit vraiment être individuel et positionné absolument sur la toile



3
votes

Si vous souhaitez coller avec votre appel à votre répartiteur, définissez la priorité à charger, elle sera appelée à la même heure que l'événement chargé et vous devez avoir une valeur. Il y a une surcharge sur Begininvoke qui prend une priorité aussi.


0 commentaires

5
votes

Vous pouvez toujours attacher un delgate au PropertymetatData / Onvaluechanged CODE> et lorsque ActuelleHeight / ActualWidth Code> Modifie de 0 à quelque chose, ajustez votre défilement, réelWidth / actuelHeight aura une valeur une fois sa rendu au moins une fois:

LocalNewsControl()
{
    var descriptor = DependencyPropertyDescriptor.FromProperty(ActualWidthProperty, typeof(TextBlock));
    if (descriptor != null)
        descriptor.AddValueChanged(myTextBlock, ActualWidth_ValueChanged);
}

private void ActualWidth_ValueChanged(object a_sender, EventArgs a_e)
{
   //Modify you scroll things here
   ...
}


0 commentaires