Pregunta

Me acabo de encontrar un nuevo desafío: hacer un procesador de textos que se maneje más como la web que el texto sin formato. Diseñar un marco agradable para esto es con lo que no puedo esperar para comenzar, pero necesito saber cuáles son las posibilidades en el lado de la GUI (probablemente tendrá muchos desafíos de GUI).

Entonces, lo básico que necesito algún tipo de control donde puedo hacer partes de mi texto que se pueden hacer clic / mouse-sobre.

Soy un poco nuevo en WPF y no estoy seguro de cómo hacer esto. ¿Alguien tiene una idea de cómo hacer esto? ¿Hay ejemplos? ¿Ya hay controles para esto?

Gracias por adelantado

EDITAR:

Descubrí alguna forma de hacerlo con un RichTextBox:

// Create a FlowDocument to contain content for the RichTextBox.
FlowDocument myFlowDoc = new FlowDocument();

// Add paragraphs to the FlowDocument.

Hyperlink myLink = new Hyperlink();
myLink.Inlines.Add("hyperlink");
myLink.NavigateUri = new Uri("http://www.stackoverflow.com");

// Create a paragraph and add the Run and hyperlink to it.
Paragraph myParagraph = new Paragraph();
myParagraph.Inlines.Add("check this link out: ");
myParagraph.Inlines.Add(myLink);
myFlowDoc.Blocks.Add(myParagraph);

// Add initial content to the RichTextBox.
richTextBox1.Document = myFlowDoc;

Ahora obtengo un buen hipervínculo en mi cuadro de texto ... excepto que cuando hago clic, no pasa nada. ¿que me estoy perdiendo aqui?

¿Fue útil?

Solución

Puedes usar el Hipervínculo clase. Es un FrameWorkContentElement, por lo que puede usarlo en un bloqueo de texto o FlowDocument o en cualquier otro lugar que pueda incrustar contenido.

<TextBlock>
    <Run>Text</Run>
    <Hyperlink NavigateUri="http://stackoverflow.com">with</Hyperlink>
    <Run>some</Run>
    <Hyperlink NavigateUri="http://google.com">hyperlinks</Hyperlink>
</TextBlock>

Es posible que desee mirar el uso de un Richtextbox como parte de tu editor. Esto alojará un Documento de flujo, que puede contener contenido como hipervínculos.


Actualización: hay dos formas de manejar los clics en el hipervínculo. Uno es para manejar el Requesternavigate evento. Es un Evento enrutado, por lo que puede unir un manejador al hipervínculo o puede unir uno a un elemento más alto en el árbol, como la ventana o el RichTextBox:

// On a specific Hyperlink
myLink.RequestNavigate +=
    new RequestNavigateEventHandler(RequestNavigateHandler);
// To handle all Hyperlinks in the RichTextBox
richTextBox1.AddHandler(Hyperlink.RequestNavigateEvent,
    new RequestNavigateEventHandler(RequestNavigateHandler));

La otra forma es usar dominante estableciendo el Dominio propiedad en el hipervínculo a un Yo ordeno implementación. El método ejecutado en el ICommand se llamará cuando se haga clic en el hipervínculo.

Si desea lanzar un navegador en el controlador, puede pasar el URI a Proceso.:

private void RequestNavigateHandler(object sender, RequestNavigateEventArgs e)
{
    Process.Start(e.Uri.ToString());
}

Otros consejos

Tenga en cuenta que también debe establecer las siguientes propiedades en su RichTextBox o los Hyperlinks se deshabilitarán y no disparará eventos. Sin Isreadonly, debe hacer clic en los hipervínculos, con Isreadonly disparan con un clic izquierdo regular.

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

La forma más sencilla es manejar el evento SoldNavigate como este:


...
myLink.RequestNavigate += HandleRequestNavigate;
...

private void HandleRequestNavigate(object sender, RoutedEventArgs e)
{
   var link = (Hyperlink)sender;
   var uri = link.NavigateUri.ToString();
   Process.Start(uri);
   e.Handled = true;
}

Hay algunos problemas al iniciar un navegador predeterminado al pasar URL al proceso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top