2010-02-12 5 views
6

Afficher du texte dans une zone de texte dont la propriété est Enabled définie sur false ou en lecture seule sur true produit du texte noir sur gris, ce qui n'est pas très agréable à lire.La meilleure façon d'afficher du texte en lecture seule en C#

Quelle est la manière la plus simple d'afficher correctement le texte en lecture seule dans Windows Forms? Vous ne pouvez pas ignorer les propriétés ForeColor et BackColor lorsqu'il est verrouillé?

Répondre

7

A défaut, créez votre propre classe de zone de texte qui écoute l'événement KeyUp et intercepte la touche si la propriété ReadOnly (ou Locked) est définie sur true (ce qui empêche son ajout au texte). Vous pouvez ensuite utiliser styles que vous aimez.

+2

Vous venez d'essayer ceci, et oui, après avoir défini la propriété ReadOnly sur True, vous pouvez en effet rétablir BackColor en blanc. –

+0

Merci - c'était rapide! –

+0

J'ai vu cela posté quelque part comme une solution à ce problème, et cela a surtout fonctionné pour moi, mais pour une raison quelconque, j'ai eu un problème avec lui en pratique. Peut-être faire avec l'accessibilité? Si je me souviens je vais mettre à jour avec pourquoi je ne suis pas allé dans cette voie (si cela fonctionne pour vous, c'est bien si je suppose :-). –

0

Ummm ... Utilisez une étiquette? Pourquoi voulez-vous utiliser une zone de texte et la rendre modifiable quand elle ne l'est pas? Voulez-vous que les utilisateurs deviennent confus? Violer les idiomes de style d'interface utilisateur habituels à vos risques et périls.

+0

Je veux afficher beaucoup de texte, qui est récupéré/généré à partir d'ailleurs. Et je veux l'afficher d'une manière lisible (comme le texte, par exemple, sur ce site). Et je le veux avec des barres de défilement, pour quand il va sur une page. –

+1

L'utilisation d'un TextBox permet à l'utilisateur de sélectionner le texte à copier. La convention dicte que le texte noir sur fond gris est en lecture seule, mais il n'est pas rare que les zones de texte standard (texte noir sur fond blanc) soient également en lecture seule. –

0

Cela semble vraiment unique horrible à faire sur Windows, en fonction du degré auquel vous voulez aller (par exemple si vous voulez que le texte soit sélectionnable ou non, si vous voulez être en mesure de faire du texte).

J'ai découvert cela il y a quelque temps mais j'ai eu la chance de trouver l'horreur raisonnablement bien documentée sur différents blogs. Il semble que vous pouvez utiliser un RichTextBox, mais créer des gestionnaires d'événements pour empêcher les utilisateurs finaux de modifier son contenu.

par exemple. RichTextBox appelé « myRichTextBox » alors vous voulez ajouter ce qui suit aux Designer.cs pour la forme:

this.myRichTextBox.SelectionChanged += new System.EventHandler(this.MyRichTextBox_Deselect); 
this.myRichTextBox.DoubleClick += new System.EventHandler(this.MyRichTextBox_Deselect); 
this.myRichTextBox.GotFocus += new System.EventHandler(this.MyRichTextBox_Deselect); 
this.myRichTextBox.LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(this.MyRichTextBox_LinkClicked); 

Et alors vous voulez créer des méthodes telles que les éléments suivants dans votre formulaire:

public void MyRichTextBox_Deselect(object sender, EventArgs e) 
{ 
    // When user tries to select text in the rich text box, 
    // set selection to nothing and set focus somewhere else. 
    RichTextBox richTextBox = sender as RichTextBox; 
    richTextBox.SelectionLength = 0; 
    richTextBox.SelectionStart = richTextBox.Text.Length; 
    // In this case I use an instance of separator bar on the form to switch focus to. 
    // You could equally set focus to some other element, but take care not to 
    // impede accessibility or visibly highlight something like a label inadvertently. 
    // It seems like there should be a way to drop focus, perhaps to the Window, but 
    // haven't found a better approach. Feedback very welcome. 
    mySeperatorBar.Focus(); 
} 

public void MyRichTextBox_LinkClicked(object sender, LinkClickedEventArgs e) 
{ 
    System.Diagnostics.Process.Start(e.LinkText); 
} 

Évidemment, vous ne vous souciez peut-être pas du gestionnaire LinkClickedEventHandler(), mais je suis sûr que cette fonctionnalité est assez courante, étant donné que le contrôle RichTextBox a la possibilité d'identifier et de colorier automatiquement les URL. Je n'ai aucune idée pourquoi il n'y a pas de solution plus élégante et je serais ravi de recevoir les commentaires de ceux qui connaissent une meilleure approche.

Questions connexes