WPF Форматирование текста в TextBlock, привязанном к строке - PullRequest
2 голосов
/ 08 января 2010

У меня есть пользовательский элемент управления, у которого есть свойство Description для строки, как показано ниже:

<CustomControl>
    <CustomControl.Description>
        Hello World
    </CustomControl.Description>
</CustomControl>

Это описание связано в нескольких местах в TextBlock, как показано ниже:

<Button>
    <Button.ToolTip>
        <TextBlock Text="{Binding Path=Description}"/>
    </Button.ToolTip>
    <TextBlock Text="{Binding Path=Description}"/>
</Button>

Как я могу добавить новые строки и жирный формат для текстовых блоков? Я пробовал:

  1. Добавление \r\n к описанию, но это не поднято.
  2. Добавление &#x0a; или &#x0d;&#x0a; к описанию, но это не поднято.
  3. Добавление <![CDATA[<LineBreak/>]]> к описанию, но это не поднято.
  4. Изменение типа описания для метки и использование элементов управления ContentPresenter для привязки к метке, но я обнаружил, что только один ContentPresenter может связываться с меткой одновременно, а другой продолжает исчезать.
  5. Меняя тип Description на FlowDocument, но я обнаружил, что не могу добавить несколько элементов управления для просмотра одного и того же документа.

Ответы [ 3 ]

1 голос
/ 08 января 2010

Вы можете изменить тип Description с простого string на object, что позволит контейнеру установить для него все, что ему нужно, расширенный текст, изображения и т. Д.

Один и тот же элемент каркаса не может быть логическим дочерним элементом двух элементов, поэтому его нельзя использовать в качестве содержимого кнопки и всплывающей подсказки одновременно.

Пример:

<CustomControl>
    <CustomControl.Description>
        <WrapPanel>
            <TextBlock Text="Hello " Foreground="Red"/>
            <TextBlock Text="World!" Foreground="Blue"/>
        </WrapPanel>
    </CustomControl.Description>
</CustomControl>

Шаблон:

<Button>
    <Button.ToolTip>
        <ContentPresenter Content="{TemplateBinding SomeOtherProperty}"/>
    </Button.ToolTip>
    <ContentPresenter Content="{TemplateBinding Description}"/>
</Button>
0 голосов
/ 09 апреля 2015

Если ваш ToolTip текст (например) не является чем-то, что вы можете знать во время разработки, но должны встраивать код после во время выполнения, то вы можете сделать это следующим образом:

TextBlock tb = new TextBlock();
tb.Inlines.Add(new Run("Background indicates packet repeat status:"));
tb.Inlines.Add(new LineBreak());
tb.Inlines.Add(new LineBreak());
Run r = new Run("White");
r.Background = Brushes.White;
tb.Inlines.Add(r);
tb.Inlines.Add(new Run("\t= Identical Packet received at this time."));
tb.Inlines.Add(new LineBreak());
r = new Run("SkyBlue");
r.Background = new SolidColorBrush(Colors.SkyBlue);
tb.Inlines.Add(r);
tb.Inlines.Add(new Run("\t= Original Packet received at this time."));

ToolTip tt = new ToolTip();
tt.Content = tb;
myButton.ToolTip = tt;

В этом примере приводится хорошо отформатированный 4-строчный текст всплывающей подсказки с выделением цветом.

Единственная причина, по которой я не использовал Brushes.SkyBlue, - продемонстрировать, что вы можете создать любой цвет, какой захотите. Например, new SolidColorBrush(Color.FromArgb(128, 86, 180, 233)); для полупрозрачного фона SkyBlue.

При выборе цветов помните о дальтониках: Color Blind Palette

0 голосов
/ 08 января 2010

Тип описания должен быть DataTemplate:

    <DataTemplate>
        <TextBlock>
                <Run>Hello</Run>
                <LineBreak/>
                <Run>World</Run>
        </TextBlock>
    </DataTemplate>

Затем вы можете использовать метки и назначить шаблон для каждой метки.

<Label FontSize="24" ContentTemplate="{Binding Inlines}"/>
<Label FontSize="10" ContentTemplate="{Binding Inlines}"/>
...