2009-11-25 6 views
3

En utilisant WinForms, j'ai une chaîne que je veux définir dans une info-bulle. La chaîne est séparée par des lignes avec Environment.NewLine, comme ceci:Texte de l'info-bulle de droite à gauche C#

x.ToolTipText = "aaaaaa" + Environment.NewLine + "bbb"; 

lorsque cette chaîne est réglée sur l'info-bulle, il semble:

aaaaaa 
bbb 

Mais mon problème est quand je veux qu'il soit localisé à l'arabe et ToolTip ne prend pas en charge la propriété RightToLeft par défaut, donc cela semble très mauvais. Je veux que ça ressemble à:

aaaaaa 
    bbb 

aussi: String.PadLeft ne vous aide pas!

Une idée?

+0

Est-ce une info-bulle asp.net (c'est-à-dire sur un contrôle html) ou s'agit-il d'une info-bulle Winforms? – Abel

+0

Si elle ne peut pas être ajustée, vous pouvez essayer d'utiliser une manière laide avec l'ajout d'espaces – RvdK

+0

il est l'application winform – song

Répondre

2

S'il s'agit de formulaires Windows, je suppose que vous devez vous fier aux caractères de contrôle Unicode pour marquer le texte de l'info-bulle en tant que RTL.

string myToolTipText = "aaaaaa"+Environment.newLine+"bbb"; 
char rle_char = (char)0x202B;// RLE embedding 
control.RightToLeft = RightToLeft.Yes; 
control.ToolTipText = rle_char + myToolTipText; 

Vérifiez this blog pour plus d'informations sur la création d'applications RTL.

S'il s'agit d'une application Web, vous pouvez consulter le w3c authoring RTL applications guidelines. Fondamentalement, il revient à la même solution que pour les formes de fenêtres, en ajoutant des caractères RLE.

+1

ça n'aide pas! – song

+0

Je n'ai malheureusement pas eu le temps de le tester, donc j'ai fait confiance au blog. J'ai trouvé une autre solution que j'ai réussi à mettre au travail. J'ai posté dans une nouvelle réponse. – PHeiberg

7

Deuxième tentative. N'a pas réussi à obtenir la solution précédente pour se comporter correctement. Trouvé d'une manière alternative en rendant l'info-bulle en utilisant une méthode de dessin personnalisée.

Configuration des contrôles:

string tip = "aaaaaa" + Environment.NewLine + "bbb";   
toolTip1.OwnerDraw = true; 
toolTip1.Draw += toolTip1_Draw; 
toolTip1.SetToolTip(textBox1, tip); 

gérer l'événement: tirage

private void toolTip1_Draw(object sender, DrawToolTipEventArgs e) 
{ 
    e.Graphics.FillRectangle(SystemBrushes.Info, e.Bounds); 
    e.DrawBorder();   
    e.DrawText(TextFormatFlags.RightToLeft | TextFormatFlags.Right); 
} 
+0

+1 pour une bonne solution! – Abel

4

Le contrôle ToolTip prend en charge déjà. La clé est que le contrôle pour lequel vous affichez la pointe a une disposition de droite à gauche. Ce formulaire exemple montre ceci:

using System; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 { 
    public partial class Form1 : Form { 
     ToolTip mTip = new ToolTip(); 
     public Form1() { 
      InitializeComponent(); 
      this.RightToLeft = RightToLeft.Yes; 
      this.RightToLeftLayout = true; 
     } 
     protected override void OnMouseDown(MouseEventArgs e) { 
      mTip.Show("Hi\nthere", this); 
     } 
    } 
} 
+0

Juste curieux, mais comment cela fonctionne-t-il avec le texte mélangé RTL/LTR? – Abel

+0

Ne fonctionne pas pour les caractères hébreux ... :-( – itsho

0

Juste quelques réflexions générales pour donner une idée de ce qui se passe: la classe infobulle ne tire pas de texte comme une zone de texte multiligne. Toute l'info-bulle est considérée comme une ligne sans un rectangle de liaison, par conséquent, RTL vs LTR n'a pas de signification (autre que l'ordre des caractères dans le texte). Résultat: l'utilisation de commutateurs normaux de droite à gauche ou de gauche à droite, avec des codes Unicode RTL ou autres, n'aidera pas à l'alignement: aucun n'est appliqué.

Une sortie est (ab) l'utilisation d'un TextBox et le place bien à la place de l'info-bulle. Mais d'autres ont montré des manières plus jolies avec les infobulles dessinées par le propriétaire, ce qui est certainement la voie à suivre.

Questions connexes