Я пытаюсь сделать все слова в текстовом блоке, которые являются кликабельными URI.Вот подход, который я выбрал:
private static void onTextChanged(DependencyObject dependObj, DependencyPropertyChangedEventArgs e)
{
WrapPanel wrapPanel = ((HyperlinkTextBlock)dependObj).LayoutRoot;
wrapPanel.Children.Clear();
// TODO: use a real wordbreaker?
// adding an extra space to the end of the last word. Cry.
IList<string> words = ((string)e.NewValue).Split(' ').Select(word => word + " ").ToList();
foreach (string word in words)
{
Uri uri;
if (Uri.TryCreate(word, UriKind.Absolute, out uri))
{
// TODO the style is off - the text is too big
wrapPanel.Children.Add(new HyperlinkButton()
{
Content = word,
NavigateUri = uri,
TargetName = "_blank",
Margin = new Thickness(0),
Padding = new Thickness(0),
});
}
else
{
wrapPanel.Children.Add(new TextBlock() { Text = word, TextWrapping = TextWrapping.Wrap });
}
}
}
(я был бы полностью готов к более XAML-ориентированному / декларативному способу сделать это, но я не уверен, как поступитьделает это.)
Это прекрасно работает (за исключением того, что было бы неплохо использовать настоящий разрушитель слов), за исключением того, что HyperlinkButton
выглядит забавно.Он слишком большой, и текст не будет переноситься.Похоже, что он также имеет некоторое смещение, которое я пытался исправить, установив Margin
и Padding
в 0, но это не решило проблему.
Есть другие идеи?На самом деле я хочу HyperlinkText
вместо HyperlinkButton
, но я не думаю, что Silverlight 3 для Windows Phone 7 предлагает это.