2010-02-12 9 views
6

Mostrar texto en un cuadro de texto cuya propiedad Enabled está establecida en falso o solo lectura en verdadero produce negro en el texto gris, lo cual no es muy agradable de leer.La mejor forma de mostrar texto de solo lectura en C#

¿Cuál es la forma más sencilla de mostrar el texto de solo lectura muy bien en Windows Forms?

Respuesta

7

¿No puede anular las propiedades ForeColor y BackColor cuando está bloqueado?

En su defecto, cree su propia clase textbox que escuche el evento KeyUp e intercepte la tecla presionada si la propiedad ReadOnly (o Locked) se establece en true (evitando que se agregue al texto). Luego puede usar cualquier estilos que te gustan

+2

Acabo de probar esto, y sí, después de establecer la propiedad ReadOnly en True, puede volver a establecer BackColor en blanco. –

+0

Gracias - ¡eso fue rápido! –

+0

Vi esto publicado en alguna parte como una solución a este problema, y ​​funcionó principalmente para mí, pero por alguna razón tuve un problema con él en la práctica. Tal vez para hacer con la accesibilidad? Si recuerdo, voy a actualizar con por qué no hice esta ruta (si funciona para usted, está bien, supongo :-). –

0

Ummm ... ¿Utilizar una etiqueta? ¿Por qué quiere usar un cuadro de texto y hacerlo editable cuando no lo es? ¿Desea que los usuarios se confundan? Viole las expresiones idiomáticas de estilo de interfaz de usuario habituales bajo su propio riesgo.

+0

Quiero mostrar una gran cantidad de texto, que se ha obtenido/generado desde otro lugar. Y quiero mostrarlo de una manera que sea legible (como el texto, por ejemplo, en este sitio web). Y lo quiero con barras de desplazamiento, para cuando pasa por una página. –

+1

El uso de un cuadro de texto permite al usuario seleccionar el texto para copiar. La convención dicta que el texto negro sobre un fondo gris es de solo lectura, pero no es poco común que las áreas de texto estándar (texto negro sobre fondo blanco) también sean de solo lectura. –

0

Esto parece realmente excepcionalmente horrible de hacer en Windows, dependiendo del grado al que desee ir (por ejemplo, si desea que el texto sea seleccionable o no, si desea poder formatear texto).

Descubrí esto hace algún tiempo pero tuve la suerte de encontrar que el horror estaba razonablemente bien documentado en varios blogs. Parece que puede usar un RichTextBox, pero crea controladores de eventos para evitar que los usuarios finales modifiquen sus contenidos.

p. Ej. RichTextBox llamado "myRichTextBox" entonces usted desea añadir lo siguiente a los Designer.cs de la forma:

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); 

Y entonces lo que desea crear métodos como los siguientes en su formulario:

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); 
} 

Obviamente, puede que no te importe el controlador LinkClickedEventHandler(), pero estoy seguro de que querer esa funcionalidad es bastante común, dado que el control RichTextBox tiene la opción de identificar y colorizar automáticamente las URL.

No tengo idea de por qué no parece haber una solución más elegante y agradecería la opinión de cualquiera que conozca un mejor enfoque.

Cuestiones relacionadas