Qual é a maneira mais fácil de construir um elemento -estrutura que possui texto de marcação ousado e itálico?
Pergunta
Existe alguma maneira mais elegante de fazer o seguinte?
Basicamente, preciso de uma maneira fácil de programaticamente construir um WrapPanel
(ou outra estrutura de estrutura) que:
- envoltórios corretamente
- permite que algumas palavras tenham negrito texto
- permite que algumas palavras tenham itálico texto
- permite outro formatação, por exemplo, cor, fundo
- ideal seria algum método que converte por exemplo "
This is <b>bold</b> and this is <i>italic</i> text.
"Em um elemento de estrutura apropriado para que eu possa, por exemplo, Adicione -o a um Stackpanel e exibi -lo.
Código:
using System.Windows;
using System.Windows.Controls;
namespace TestAddTextBlock2343
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
WrapPanel wp = new WrapPanel();
wp.AddTextBlock("This is a sentence with ");
{
TextBlock tb = wp.AddTextBlockAndReturn("bold text");
tb.FontWeight = FontWeights.Bold;
}
wp.AddTextBlock(" and ");
{
TextBlock tb = wp.AddTextBlockAndReturn("italic text");
tb.FontStyle = FontStyles.Italic;
}
wp.AddTextBlock(" in it.");
}
}
public static class XamlHelpers
{
public static TextBlock AddTextBlockAndReturn(this WrapPanel wp, string text)
{
TextBlock tb = new TextBlock();
tb.Text = text;
wp.Children.Add(tb);
return tb;
}
public static void AddTextBlock(this WrapPanel wp, string text)
{
TextBlock tb = wp.AddTextBlockAndReturn(text);
}
}
}
Solução
Edit: eu descobri em uma resposta diferente que o TextBlock
também tem um Inlines
coleção a que se pode adicionar Run
s. Resposta de Anvaka Engenhamente usa uma propriedade anexada como uma espécie de conversor.
O que eu acho que vai se adequar à sua situação é um FlowDocumentScrollViewer
e a FlowDocument
. Eu descrevo a criação manual de um a um IValueConverter
um pouco aqui.
Você provavelmente usará funções auxiliares semelhantes, como você mostrou no seu exemplo, mas o FlowDocument
Já é muito parecido com o HTML e vai lidar com o embrulho sem esforço.
Você adiciona Paragraph
s para o FlowDocument
, você adiciona Run
s para o Paragraph
, e cada um Run
deriva de TextElement
Portanto, tem muitas das mesmas propriedades que TextBlock
s fazer.
FlowDocument doc = new FlowDocument();
Paragraph par = new Paragraph();
doc.Blocks.Add( par );
Run r;
r = new Run( "This is " );
par.Inlines.Add( r );
r = new Run( "bold" );
r.FontWeight = FontWeights.Bold;
par.Inlines.Add( r );
r = new Run( " and this is " );
par.Inlines.Add( r );
r = new Run( "italic" );
r.FontStyle = FontStyles.Italic;
par.Inlines.Add( r );
r = new Run( " text." );
par.Inlines.Add( r );
Além disso, se as substâncias de formatação permanecerão restritas a etiquetas ousadas/itálicas ou alguma outra marcação extremamente simples, uso de Regex.Split()
pode ser a maneira mais fácil de determinar o separado Run
s de uma única string. Ele permite dividir uma corda em várias cordas, mas mantenha seus "delimitadores".