Как установить цвет некоторых слов в FlowText?

я есть FlowDocument, содержащий вещи, связанные с моей ViewModel, как это:

<FlowDocumentReader>
  <FlowDocument>
    <Paragraph>
      <Run Text="{Binding MyTextProperty}"/>
    </Paragraph>
  </FlowDocument>
</FlowDocumentReader>

Теперь я хочу отобразить список классов с использованием какого-либо типа DataTemplate, но не знаю, с чего начать. Скажем, я получил класс, как:

public MyClass
{
  String Title {get;set;}
  String FlowText {get;set;}
}

public List<MyClass> MyList {get;set;}

И я хотел бы привязать это к списку FlowDocument, например:

<FlowDocumentReader>
  <FlowDocument>
    <List Items="{Binding MyList}">
      <Bold><Run Text="{Binding Title}"/></Bold>
      <LineBreak/>
      <Run Text="{Binding FlowText}"/>
    </Paragraph>
  </FlowDocument>
</FlowDocumentReader>

Конечно, это не работает - но я не могу найти никакого объяснения, как связать списки в FlowDocument с использованием шаблонов - возможно ли это?

Ответы на вопрос(1)

Решение Вопроса

этот вопрос.

Я думаю, у вас есть два варианта

Использование ItemsControlИспользование прикрепленного свойства

Обновить
Более динамическое решение, использующее два прикрепленных свойства. Ресурс с шаблоном добавляется в абзац (который должен иметьx:Shared="False" набор атрибутов, в противном случае мы будем просто добавлять одни и те же элементы снова и снова). Затем список источников и имя ресурса шаблона устанавливаются в качестве вложенных свойств.

В обратном вызове PropertyChanged выполняется проверка того, что оба свойства установлены, а затемSpan элемент создается для каждого элемента в списке. Элементы spanDataContext устанавливается на текущий элемент, чтобы заставить работать привязки

<FlowDocumentReader xmlns:Collections="clr-namespace:System.Collections;assembly=mscorlib">
    <FlowDocument>
        <Paragraph behaviors:ParagraphInlineBehavior.ParagraphInlineSource="{Binding MyList}"
                   behaviors:ParagraphInlineBehavior.TemplateResourceName="inlineTemplate">
            <Paragraph.Resources>
                <Collections:ArrayList x:Shared="False" x:Key="inlineTemplate">
                    <Bold>
                        <Run Text="{Binding Title}"/>
                    </Bold>
                    <LineBreak/>
                    <Run Text="{Binding FlowText}"/>
                    <LineBreak/>
                </Collections:ArrayList>
            </Paragraph.Resources>
        </Paragraph>
    </FlowDocument>
</FlowDocumentReader>

ParagraphInlineBehavior

public class ParagraphInlineBehavior : DependencyObject
{
    public static readonly DependencyProperty TemplateResourceNameProperty =
        DependencyProperty.RegisterAttached("TemplateResourceName",
                                            typeof(string),
                                            typeof(ParagraphInlineBehavior),
                                            new UIPropertyMetadata(null, OnParagraphInlineChanged));
    public static string GetTemplateResourceName(DependencyObject obj)
    {
        return (string)obj.GetValue(TemplateResourceNameProperty);
    }
    public static void SetTemplateResourceName(DependencyObject obj, string value)
    {
        obj.SetValue(TemplateResourceNameProperty, value);
    }

    public static readonly DependencyProperty ParagraphInlineSourceProperty =
        DependencyProperty.RegisterAttached("ParagraphInlineSource",
                                            typeof(IEnumerable),
                                            typeof(ParagraphInlineBehavior),
                                            new UIPropertyMetadata(null, OnParagraphInlineChanged));
    public static IEnumerable GetParagraphInlineSource(DependencyObject obj)
    {
        return (IEnumerable)obj.GetValue(ParagraphInlineSourceProperty);
    }
    public static void SetParagraphInlineSource(DependencyObject obj, IEnumerable value)
    {
        obj.SetValue(ParagraphInlineSourceProperty, value);
    }

    private static void OnParagraphInlineChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        Paragraph paragraph = d as Paragraph;
        IEnumerable inlines = ParagraphInlineBehavior.GetParagraphInlineSource(paragraph);
        string templateName = ParagraphInlineBehavior.GetTemplateResourceName(paragraph);
        if (inlines != null && templateName != null)
        {
            paragraph.Inlines.Clear();
            foreach (var inline in inlines)
            {
                ArrayList templateList = paragraph.FindResource(templateName) as ArrayList;
                Span span = new Span();
                span.DataContext = inline;
                foreach (var templateInline in templateList)
                {
                    span.Inlines.Add(templateInline as Inline);
                }
                paragraph.Inlines.Add(span);
            }
        }
    }
}
 Tanya17 янв. 2012 г., 08:20
Как установить цвет некоторых слов в FlowText?
 Sam07 янв. 2011 г., 10:12
Интересно, можно ли с помощью этого Flowdocument все еще редактировать в blend, что было бы прекрасно.
 Fredrik Hedblad07 янв. 2011 г., 11:35
@Sam: Вы имеете в виду добавление слов "Bold", "Run" и т. Д. КParagraph или как вы обычно работаете сFlowDocument в смеси? Я никогда не делал это :)
 jk.31 окт. 2011 г., 12:45
Кажется, у меня возникают проблемы с этим решением, особенно когда запускаются присоединенные свойства, свойство Resources еще не заполнено, поэтому нет ресурса "inlineTemplate" для поиска.

Ваш ответ на вопрос