Динамический пользовательский контент в RichTextBox - PullRequest
1 голос
/ 03 ноября 2011

Я хочу отобразить текст + гиперссылки в RichTextBox из выделенного кода или через Xaml, если есть такая возможность.

На данный момент у меня есть строковая переменная с URL (что я бы очень хотел сделать кликабельным), привязанным к TextBlock.Я хотел бы в основном заменить:

<TextBlock Text="{Binding myTextWithUrl}" />

на (в richTB:)

<Run Text="partOfTextNonUrl" /><Hyperlink NavigateUri="theUrl" TargetName="whatever" />

Вот как это выглядит:

У меня есть ItemsControlшаблонируется с пользовательским объектом

<ItemsControl ItemsSource="{Binding FeedResults}">
 <ItemsControl.ItemTemplate>
  <DataTemplate>
   <StackPanel Orientation="Vertical" >
    <my:SearchResultItem />
   </StackPanel>
  </DataTemplate>
 </ItemsControl.ItemTemplate>
</ItemsControl>

И этот пользовательский элемент управления представляет связанные данные в 3 текстовых блоках, как показано выше: заголовок, дата и текст, содержащий текст + URL-адреса.метод, который извлекает URL из строки, я просто не знаю, как его использовать.Я могу генерировать динамически Run () и Hyperlink (), и добавлять их в абзац, но как связать?

Или любое другое решение?Ты бы сделал мой день !!

Спасибо, Сильвен

Ответы [ 2 ]

0 голосов
/ 04 ноября 2011

OK. Таким образом, встроенные гиперссылки даже не разрешены в Silverlight. Но вы можете сделать свой собственный!

http://csharperimage.jeremylikness.com/2009/11/inline-hyperlinks-in-silverlight-3.html

Нелегко - по крайней мере, не так легко. Но это должно сделать работу.

Если у вас есть возможность добавить эти прогоны с гиперссылками, я бы подошел к этому так. Создайте пользовательский элемент управления с одним TextBlock (txtContent). Установите DataContext="{Binding myTextWithUrl}". Тогда в коде позади:

public TextWithUrlUserControl()
{
    InitializeComponent();

    this.Loaded += (s, e) =>
                        {
                            foreach(var inline in ParseText(DataContext as string))
                                txtContent.Inlines.Add(inline);
                        };
} 

IEnumerable<Inline> ParseText(string text)
{
    // return list of Runs and Runs with hyperlinks using your URL parsing
    // for demo purposes, just hardcoding it here:
    return new List<Inline>
                {
                    new Run{Text="This text has a "},
                    new Run{Text="URL", RunExtender.NavigateUrl="http://www.google.com/"},
                    new Run{Text="in it!"}
                };    
}

Надеюсь, это полезно.

0 голосов
/ 03 ноября 2011

Я бы сделал что-то подобное. Создайте ValueConverter, который будет принимать ваш текст (с URL-адресом в нем). Затем в вашем TextBlock создайте Run и Hyperlink - свяжите оба с текстом, оба с помощью ValueConverter, но с другим параметром для ValueConverter.

ValueConverter:

public class MyCustomValueConverter: IValueConverter
{    
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if(parameter.ToString()== "URL")
        {
            // return the URL part of the string
        }
        else
        {
            // return the non-URL portion of the string
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Тогда ваш XAML выглядит так:

<Run Text="{Binding myTextWithUrl, Converter={StaticResource valueConverter}}"></Run><Hyperlink NavigateUri="{Binding myTextWithUrl, Converter={StaticResource valueConverter}, ConverterParameter=URL}"></Hyperlink>
...