Qual é a maneira mais fácil de construir um elemento -estrutura que possui texto de marcação ousado e itálico?

StackOverflow https://stackoverflow.com/questions/2280924

  •  21-09-2019
  •  | 
  •  

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);
        }
    }
}
Foi útil?

Solução

Edit: eu descobri em uma resposta diferente que o TextBlock também tem um Inlines coleção a que se pode adicionar Runs. 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 Paragraphs para o FlowDocument, você adiciona Runs para o Paragraph, e cada um Run deriva de TextElement Portanto, tem muitas das mesmas propriedades que TextBlocks 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 Runs de uma única string. Ele permite dividir uma corda em várias cordas, mas mantenha seus "delimitadores".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top