2009-04-17 22 views
9

Tengo un cuadro de texto enriquecido WPF con isReadOnly establecido en True. Me gustaría que los usuarios puedan hacer clic en HyperLinks contenidos dentro de RichTextBox, sin tener que mantener presionada la tecla Ctrl.Al hacer clic en HyperLinks en un cuadro de texto enriquecido sin presionar CTRL - WPF

El evento Click en HyperLink no parece activarse a menos que Ctrl esté presionado, por lo que no estoy seguro de cómo proceder.

+2

¿Ya le agradecemos a Skeet? ¡Muy engañoso! – Anthony

+0

@Anthony, era una firma (mira la ortografía) – JaredPar

+1

Hehehe, de hecho soy John, pero si aparece Skeet, definitivamente le agradeceré :) –

Respuesta

3

Se las arregló para encontrar una forma de evitar esto, casi por accidente.

El contenido que se carga en mi RichTextBox simplemente se almacena (o se ingresa) como una cadena simple. He subclasificado el RichTextBox para permitir el enlace contra su propiedad de documento.

Lo que es relevante para la cuestión, es que tengo una sobrecarga IValueConverter Convert() que se ve algo como esto (código que no sea esencial a la solución ha sido despojado a cabo):

FlowDocument doc = new FlowDocument(); 
Paragraph graph = new Paragraph(); 

Hyperlink textLink = new Hyperlink(new Run(textSplit)); 
textLink.NavigateUri = new Uri(textSplit); 
textLink.RequestNavigate += 
    new System.Windows.Navigation.RequestNavigateEventHandler(navHandler); 

graph.Inlines.Add(textLink); 
graph.Inlines.Add(new Run(nonLinkStrings)); 

doc.Blocks.Add(graph); 

return doc; 

Esto me la pone Comportamiento que quiero (empujar cadenas simples en RichTextBox y obtener formato) y también da como resultado enlaces que se comportan como un enlace normal, en lugar de uno que está incrustado en un documento de Word.

+0

¿Dónde y cómo se creó el var textSplit? –

+0

Esta respuesta debe tener la mayoría de los votos por mayor. –

0

¿Ha intentado manejar el evento MouseLeftButtonDown en lugar del evento Click?

17

Encontré una solución. Establezca IsDocumentEnabled en "True" y establezca IsReadOnly en "True".

<RichTextBox IsReadOnly="True" IsDocumentEnabled="True" /> 

Una vez que hice esto, el ratón se convertirá en una 'mano' cuando se ciernen sobre un texto que se muestra dentro de una etiqueta de hipervínculo. Hacer clic sin mantener el control disparará el evento 'Hacer clic'.

Estoy usando WPF de .NET 4. No sé si las versiones anteriores de .NET no funcionan como he descrito anteriormente.

+5

esto tiene el efecto secundario desafortunado de hacer que el texto no se pueda seleccionar para copiar y pegar. – Julien

10

JHubbard80 es una solución posible, es la forma más fácil si no necesita que se seleccione el contenido.

Sin embargo, necesito eso: P aquí está mi enfoque: establecer un estilo para el Hyperlink dentro del RichTextBox. Lo esencial es usar un EventSetter para hacer que el Hyperlink maneje el evento MouseLeftButtonDown.

<RichTextBox> 
    <RichTextBox.Resources> 
     <Style TargetType="Hyperlink"> 
      <Setter Property="Cursor" Value="Hand" /> 
      <EventSetter Event="MouseLeftButtonDown" Handler="Hyperlink_MouseLeftButtonDown" /> 
     </Style> 
    </RichTextBox.Resources> 
</RichTextBox> 

Y en código subyacente:

private void Hyperlink_MouseLeftButtonDown(object sender, MouseEventArgs e) 
{ 
    var hyperlink = (Hyperlink)sender; 
    Process.Start(hyperlink.NavigateUri.ToString()); 
} 

Gracias a gcores para la inspiaration.

+0

No obtengo la mano, pero lo que sea. Funciona, y aún mejor, me da acceso al código de navegación del hipervínculo, así que si un directorio no existe, ¡mi aplicación no se bloquea! – Darkhydro

+0

El manejo del evento click funcionó para mí.Puede ser una cosa de Windows 10/WPF 4.5 pero funcionó. Gracias. –

Cuestiones relacionadas