IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Silverlight Discussion :

Mesurer la taille d'une String en pixels


Sujet :

Silverlight

  1. #1
    Membre habitué

    Profil pro
    Inscrit en
    Avril 2002
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 192
    Points : 144
    Points
    144
    Par défaut Mesurer la taille d'une String en pixels
    Est ce que quelqu'un pourrait m'indiquer une méthode équivalente à Graphics.MeasureString() qui mesure la taille (en pixels) d'une chaine de caractères.
    Cette méthode n'est pas accessible en Silverlight.

    Je suis aussi preneur de la moindre idée de méthode qui permettrai de faire la même chose.

    Merci d'avance.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 754
    Points
    39 754
    Par défaut
    Il y a en WPF une classe System.Windows.Media.FormattedText, je sais pas si elle existe aussi en Silverlight...
    Regarde notamment les propriétés Width et Height

  3. #3
    Membre habitué

    Profil pro
    Inscrit en
    Avril 2002
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 192
    Points : 144
    Points
    144
    Par défaut
    Comme tu l'as supposé, la classe FormattedText est WPF et n'est pas accessible en Silverlight.
    Idem pour la fonction MeasureString dans WinForms...

  4. #4
    Membre régulier

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 68
    Points : 104
    Points
    104
    Par défaut Mesure via un TextBlock
    Ci-après, un helper pour effectuer les mesures. A la date d'aujourd'hui, je n'ai pas trouvé d'autre moyen. Cela peut sembler un peu 'lourd', mais dans la réalité l'objet TextBlock est un objet simple et 'léger'.

    Le helper décline deux méthodes dont les performences sont suceptibles de changer en fonction du contexte. La première privilégie les ressources mais peut s'avérer plus lente dans le cadre d'une utilisation multi-thread.

    On pourrait sans la moindre difficulté ajouter des méthodes pour mesurer une chaîne en imposant une largeur maximal...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    public static class MeasureHelper
    {
        private static TextBlock MeasureTextBlock = new TextBlock();
     
        public static Size MeasureString(string Text, FontFamily FontFamily, double FontSize)
        {
            //---> Vérouillage du TextBlock car en Silverlight ou se retrouve très vite
            // dans un context multi-thread.
            lock (MeasureTextBlock)
            {
                return MeasureString(MeasureTextBlock, Text, FontFamily, FontSize);
            }
        }
     
        public static Size MeasureString2(string Text, FontFamily FontFamily, double FontSize)
        {
            var tb = new TextBlock();
            return MeasureString(tb, Text, FontFamily, FontSize);
        }
     
        private static Size MeasureString(TextBlock tb, string Text, FontFamily FontFamily, double FontSize)
        {
            tb.Text = Text;
            tb.FontSize = FontSize;
            tb.FontFamily = FontFamily;
            return new Size(tb.ActualWidth, tb.ActualHeight);
        }
    }

  5. #5
    Membre habitué

    Profil pro
    Inscrit en
    Avril 2002
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 192
    Points : 144
    Points
    144
    Par défaut
    Merci de ta réponse mlebreton.

    Pourquoi avoir vérouiller le TextBlock? Que peut il se passer si on ne le vérouille pas?

  6. #6
    Membre régulier

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 68
    Points : 104
    Points
    104
    Par défaut
    Pourquoi vérouiller ?

    Que se passerait-il si la méthode MeasureString était appelée depuis plusieurs point de l'application qui seraient exécuté sur des threads différents (ce qui arrive très vite en Silverlight) ? Et bien cela introduirait un bogue car le même TextBlock (qui est static) serait utilisé en même temps par plusieurs traitements. Nous ne pourions alors pas garantir la validité de la mesure effectuée. C'est pour cette raison qu'il est prudent de vérouiller le TextBlock. Ainsi, chaque thread attend son tour.

    La seconde méthode MeasureString2 n'est pas confronté à ce problème puisque le TextBlock est local à la méthode. Aucun thread n'est obligé d'attendre quoi que ce soit. En revanche, cette seconde méthode instancie un TextBlock à chaque appel. Comme il s'agit d'une méthode de mesure, elle va surement être impliquée dans des traitement liés à l'interface. Elle est donc succeptible d'être appelée des centaines, voir des milliers de fois. Comme le garbadge collector fait ce qu'il veut, les TextBlock instanciés seront libérés très 'Tardivement'. Cela abouti à une utilisation très libérale de la mémoire.

    Evidemment, entre les deux approches, le coeur balance. C'est pourquoi j'ai mis les deux...

    Une troisième pourrait être envisagée, à mis chemin entre les deux. Le TextBlock pourrait être une variable static de thread...

  7. #7
    Membre habitué

    Profil pro
    Inscrit en
    Avril 2002
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 192
    Points : 144
    Points
    144
    Par défaut
    OK, merci de cette explication.
    Je ne voyais pas non plus l'intérêt de mettre le TextBlock en static, mais je me rends compte que cela peut avoir un véritable impact sur les performances.
    Merci encore!

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 35
    Points : 39
    Points
    39
    Par défaut
    Une autre façon de proposer le helper de mlebreton:

    http://www.silverlightissues.com/issue.php5?i=62

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/03/2007, 11h53
  2. [JS] Taille d'une string en px
    Par Shivan dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 03/07/2006, 14h16
  3. [VB6]Taille d'une chaine en pixel
    Par pier* dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 14/04/2006, 12h54
  4. Taille d'une chaine en pixels...
    Par zoubidaman dans le forum C++Builder
    Réponses: 4
    Dernier message: 13/07/2004, 10h58
  5. [JDBC] Forcer la taille d'une string
    Par julio123 dans le forum JDBC
    Réponses: 4
    Dernier message: 10/06/2004, 09h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo