google - Silverlight 2.0-No puedo obtener el comportamiento de ajuste de texto que quiero
habilitar silverlight en chrome (9)
¿Esto funcionaría? http://www.silverlightshow.net/items/Silverlight-LinkLabel-control.aspx
Tengo problemas para que Silverlight 2.0 muestre el texto exactamente como quiero. Quiero texto con saltos de línea y enlaces incrustados, con ajuste, como texto HTML en una página web.
Aquí está lo más cercano que he venido:
<UserControl x:Class="FlowPanelTest.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Controls="clr-namespace:Microsoft.Windows.Controls;assembly=Microsoft.Windows.Controls"
Width="250" Height="300">
<Border BorderBrush="Black" BorderThickness="2" >
<Controls:WrapPanel>
<TextBlock x:Name="tb1" TextWrapping="Wrap">Short text. </TextBlock>
<TextBlock x:Name="tb2" TextWrapping="Wrap">A bit of text. </TextBlock>
<TextBlock x:Name="tb3" TextWrapping="Wrap">About half of a line of text.</TextBlock>
<TextBlock x:Name="tb4" TextWrapping="Wrap">More than half a line of longer text.</TextBlock>
<TextBlock x:Name="tb5" TextWrapping="Wrap">More than one line of text, so it will wrap onto the following line.</TextBlock>
</Controls:WrapPanel>
</Border>
</UserControl>
Pero el problema es que aunque los bloques de texto tb1 y tb2 van a la misma línea porque hay espacio suficiente para ellos por completo, tb3 en adelante no comenzará en la misma línea que el bloque anterior, aunque se ajustará a las siguientes líneas.
Quiero que cada bloque de texto comience donde termina el anterior, en la misma línea. Quiero poner click manejadores de eventos en algunos de los textos. También quiero saltos de párrafo. Básicamente, estoy tratando de evitar la falta de controles FlowDocument y Hyperlink en el subconjunto de XAML de Silverlight 2.0.
Para responder a las preguntas planteadas en las respuestas:
¿Por qué no usar ejecuciones para el texto que no se puede hacer clic? Si solo uso TextBlocks individuales solo en el texto que se puede hacer clic, esos fragmentos de texto seguirán sufriendo el problema de envoltura que se ilustra arriba. Y el TextBlock justo antes del enlace, y el TextBlock justo después. Esencialmente todo. No parece que tenga muchas oportunidades para poner varias ejecuciones en el mismo TextBlock.
Dividir los enlaces del otro texto con RegExs y loops no es el problema en absoluto, el problema es el diseño de visualización.
¿Por qué no poner cada palabra en un TextBlock individual en un WrapPanel? Además de ser un hack feo, esto no funciona bien con linebreaks: el diseño es incorrecto.
También haría que el estilo de subrayado del texto vinculado se convierta en una línea discontinua.
Aquí hay un ejemplo con cada palabra en su propio TextBlock. Intente ejecutarlo, tenga en cuenta que el salto de línea no se muestra en absoluto en el lugar correcto.
<UserControl x:Class="SilverlightApplication2.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Controls="clr-namespace:Microsoft.Windows.Controls;assembly=Microsoft.Windows.Controls"
Width="300" Height="300">
<Controls:WrapPanel>
<TextBlock TextWrapping="Wrap">Short1 </TextBlock>
<TextBlock TextWrapping="Wrap">Longer1 </TextBlock>
<TextBlock TextWrapping="Wrap">Longerest1 </TextBlock>
<TextBlock TextWrapping="Wrap">
<Run>Break</Run>
<LineBreak></LineBreak>
</TextBlock>
<TextBlock TextWrapping="Wrap">Short2</TextBlock>
<TextBlock TextWrapping="Wrap">Longer2</TextBlock>
<TextBlock TextWrapping="Wrap">Longerest2</TextBlock>
<TextBlock TextWrapping="Wrap">Short3</TextBlock>
<TextBlock TextWrapping="Wrap">Longer3</TextBlock>
<TextBlock TextWrapping="Wrap">Longerest3</TextBlock>
</Controls:WrapPanel>
</UserControl>
¿Qué pasa con LinkLabelControl como aquí y aquí ? Tiene los mismos problemas que el enfoque anterior, ya que es muy parecido. Intente ejecutar la muestra y haga que el texto del enlace sea más largo y más largo hasta que se envuelva. Tenga en cuenta que el enlace comienza en una nueva línea, que no debería. Haga que el texto del enlace sea aún más largo, de modo que el texto del enlace sea más largo que una línea. Tenga en cuenta que no se ajusta para nada, se corta. Este control tampoco maneja saltos de línea y saltos de párrafo.
¿Por qué no poner todo el texto en ejecuciones, detectar clics en el bloque de texto que lo contiene y calcular en qué ejecución se hizo clic? La ejecución no tiene eventos de mouse, pero sí lo hace TextBlock. No puedo encontrar una manera de verificar si la ejecución está debajo del mouse (IsMouseOver no está presente en SilverLight) o para encontrar la geometría delimitadora de la ejecución (sin propiedad de clip).
Hay VisualTreeHelper.FindElementsInHostCoordinates ()
El siguiente código usa VisualTreeHelper.FindElementsInHostCoordinates para obtener los controles con un clic. La salida muestra el TextBlock pero no el Run, ya que una Ejecución no es un UiElement.
private void theText_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
// get the elements under the click
UIElement uiElementSender = sender as UIElement;
Point clickPos = e.GetPosition(uiElementSender);
var UiElementsUnderClick = VisualTreeHelper.FindElementsInHostCoordinates(clickPos, uiElementSender);
// show the controls
string outputText = "";
foreach (var uiElement in UiElementsUnderClick)
{
outputText += uiElement.GetType().ToString() + "/n";
}
this.outText.Text = outputText;
}
Use un bloque de texto vacío con un margen para espaciar el siguiente contenido en la siguiente línea
Todavía estoy pensando en esto. ¿Cómo se calcula el ancho correcto para un bloque de salto de línea para forzar el siguiente contenido en la siguiente línea? Demasiado corto y el siguiente contenido seguirá estando en la misma línea, a la derecha. Demasiado tiempo y el "salto de línea" estará en la siguiente línea, con el contenido después. Tendría que cambiar el tamaño de los descansos cuando se cambia el tamaño del control.
Algunos de los códigos para esto son:
TextBlock lineBreak = new TextBlock();
lineBreak.TextWrapping = TextWrapping.Wrap;
lineBreak.Text = " ";
// need adaptive width
lineBreak.Margin = new Thickness(0, 0, 200, 0);
Una pregunta muy interesante. Es posible que necesite crear su propio control personalizado para manejar este tipo de diseño. Puede utilizar Ejecuciones, pero superponer un lienzo transparente en la parte superior de cada ejecución para que pueda manejar el evento de clic vinculado a esa ejecución. No es una solución fácil, pero creo que sería posible.
Por favor, díganme con qué vienen.
¿Por qué no puedes usar carreras?
Use ejecuciones para concatenar todos los valores que no van a tener eventos, luego aquellos que tienen eventos se dividen en su propio bloque de texto, enjuague la repetición de la espuma.
Me parece que deberías ser capaz de hacer esto con RegEx y algunos bucles. Eche un vistazo a la publicación de Jesse Liberty en el panel de resumen y vea si eso fomenta cualquier pensamiento. http://silverlight.net/blogs/jesseliberty/archive/2008/12/03/the-wrap-panel.aspx
hth
Podría intentar usar SOLAMENTE Ejecuciones dentro de su TextBlock, y usar un controlador de un solo clic para todo el TextBlock. El controlador puede ubicar la fuente Ejecutar utilizando las coordenadas del evento click, averiguar si se trata de un enlace (cada Ejecución que es un enlace puede tener una x: Nombre específica, o incluso puede derivar su propia Ejecución) e invocar la funcionalidad correcta para ese enlace.
Nunca lo intenté, pero esta es la forma en que trataría de resolver el problema.
Si bien no existe una propiedad de tipo IsMouseOver, puede ver usando VisualTreeHelper.FindElementsInHostCoordinates ()
No estoy seguro si está revisando los comentarios en sus comentarios o no porque no dirigió algunas de las cosas que dije en mis comentarios sobre los suyos. La razón por la que no puede encontrar ejecuciones usando VisualTreeHelper.FindElementsInHostCoordinates () es porque solo devuelve UIElements y Runs no son UIElements. Si combina este método con la sugerencia de no usar ninguna carrera, entonces debería estar bien, ¿verdad?
El, cada palabra como un bloque de texto no es tan malo como un "truco" y puedes evitar el problema de los saltos de línea separando los saltos de línea en su propio bloque de texto y asignando a esos bloques de texto un ancho o margen igual al ancho del envolver el panel que los obligaría a sentarse en su propia línea. Definitivamente no es la solución más ideal, pero no he visto nada más que muestre alguna promesa todavía.
El HtmlTextBlock para Silverlight. No es realmente un concepto terminado, pero podría ser un buen punto de partida.
Voy a poner algunas respuestas a mi propia pregunta, en base a lo que he encontrado:
1) puede hacerlo fácilmente en el WPF de escritorio completo con un documento de flujo lleno de párrafos, hipervínculos, ejecuciones y objetos relacionados.
Esto es lo que estoy haciendo ahora, ya no estoy tratando de resolver este problema en Silverlight.
2) Use Silverlight 4 No puede hacer esto en Silverlight 2 o 3. Sin embargo, Silverlight 4 tiene un RichTextArea Control que, cuando es de solo lectura, admite este tipo de visualización del diseño de flujo con hipervínculos en línea, y actúa como una versión reducida de FlowDocument y clases relacionadas de WPF. Silverlight 4 también permite que el control del navegador web incorporado muestre contenido HTML, si puede hacer que se vea igual en todas las versiones de Windows (es decir, versiones de IE) y en Mac y potencialmente en otras plataformas.
3) Probablemente puedas hacer algo como esto en Silverlight (cualquier versión) construyendo una cadena de HTML e inyectándolo en el DOM para mostrarlo en la parte de la página que está fuera del control de Silverlight. Parece completamente viable, pero en mi opinión, demasiado inteligente a la mitad.
Creo que la mejor manera de hacerlo sería hacer que cada palabra sea un bloque de texto y luego adjuntar las palabras a los controladores de eventos correctos que desee para secciones particulares. Esto le daría la envoltura que desea y para la sangría en la primera palabra, puede establecer su margen izquierdo.
Consulte este artículo para ver un ejemplo en el que se hace algo similar con el texto y el panel de ajuste. http://jesseliberty.com/2008/12/03/the-wrap-panel/