gpt4 book ai didi

c# - 通过绑定(bind)在 TextBlock 中创建超链接

转载 作者:太空狗 更新时间:2023-10-30 00:24:14 27 4
gpt4 key购买 nike

我的问题是从文本内容中找到 url 并通过数据绑定(bind)将其转换为可点击的超链接。

这是我试过的

 <TextBlock Tag="{Binding message}" x:Name="postDescription" TextWrapping="Wrap" 
Grid.Row="3" Grid.ColumnSpan="3" Margin="10,10,10,12" FontSize="16"
TextAlignment="Justify" Foreground="{StaticResource foreGroundWhite}" >
<Run Text="{Binding description, Converter={StaticResource statusFormatter}}" />
</TextBlock>

在代码中,

public class StatusFormatter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
return returnTextWithUrl((String)value);
}

public static String returnTextWithUrl(String text)
{
if(text == null) { return null; }
MatchCollection mactches = uriFindRegex.Matches(text);

foreach (Match match in mactches)
{
//Need Help here
HyperlinkButton hyperlink = new HyperlinkButton();
hyperlink.Content = match.Value;
hyperlink.NavigateUri = new Uri(match.Value);
text = text.Replace(match.Value, ??);
}
return text;
}
}
}

输出应该是这样的

<TextBlock Tag="{Binding message}" x:Name="postDescription" TextWrapping="Wrap" 
Grid.Row="3" Grid.ColumnSpan="3" Margin="10,10,10,12" FontSize="16"
TextAlignment="Justify" Foreground="{StaticResource foreGroundWhite}" >
Click this link -
<Hyperlink NavigateUri="http://www.bing.com">bing</Hyperlink>
- for more info.
</TextBlock>

有什么帮助吗?

最佳答案

要执行您想要的操作,您必须使用 TextBlockInlines 属性,但由于它不是 DependencyProperty,因此不能绑定(bind)的目标。我们将不得不扩展您的 TextBlock 类,但由于它是密封的,我们将不得不使用其他类。

让我们定义static 类,它将添加适当的内联 - HyperlinkRun ,取决于 Regex 匹配。它可以看起来像这样的例子:

public static class TextBlockExtension
{
public static string GetFormattedText(DependencyObject obj)
{ return (string)obj.GetValue(FormattedTextProperty); }

public static void SetFormattedText(DependencyObject obj, string value)
{ obj.SetValue(FormattedTextProperty, value); }

public static readonly DependencyProperty FormattedTextProperty =
DependencyProperty.Register("FormattedText", typeof(string), typeof(TextBlockExtension),
new PropertyMetadata(string.Empty, (sender, e) =>
{
string text = e.NewValue as string;
var textBl = sender as TextBlock;
if (textBl != null)
{
textBl.Inlines.Clear();
Regex regx = new Regex(@"(http://[^\s]+)", RegexOptions.IgnoreCase);
var str = regx.Split(text);
for (int i = 0; i < str.Length; i++)
if (i % 2 == 0)
textBl.Inlines.Add(new Run { Text = str[i] });
else
{
Hyperlink link = new Hyperlink { NavigateUri = new Uri(str[i]), Foreground = Application.Current.Resources["PhoneAccentBrush"] as SolidColorBrush };
link.Inlines.Add(new Run { Text = str[i] });
textBl.Inlines.Add(link);
}
}
}));
}

然后在 XAML 中我们像这样使用它:

<TextBlock local:TextBlockExtension.FormattedText="{Binding MyText}" FontSize="15"/>

在将一些文本添加到我的属性中之后:

private void firstBtn_Click(object sender, RoutedEventArgs e)
{
MyText = @"Simple text with http://mywebsite.com link";
}

我可以看到这样的结果:

SampleLink

关于c# - 通过绑定(bind)在 TextBlock 中创建超链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27734084/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com