使用XAMLParser解析TextBox,无法弄清楚如何管理超链接的事件

时间:2014-05-26 14:05:10

标签: c# wpf xaml hyperlink

我有一个解析器XamlReader.Parse(xamlFile),我需要在其中解析超链接。 我有TextBlock(它支持超链接),但不知道如何使我想要的单词可以点击。

1 个答案:

答案 0 :(得分:0)

您可以使用VisualTreeHelper来替换所有匹配的文字Hyperlink

以下是一个示例:

void CreateLinks(FrameworkElement fe)
{
    Uri URI = new Uri("http://google.com");

    TextBlock tb = fe as TextBlock;
    if (tb != null)
    {
        string[] tokens = tb.Text.Split();

        tb.Inlines.Clear();

        foreach (string token in tokens)
        {
            if (token == "Click")
            {
                Hyperlink link = new Hyperlink { NavigateUri = URI };
                link.Inlines.Add("Click");
                tb.Inlines.Add(link);
            }
            else
            {
                tb.Inlines.Add(token);
            }

            tb.Inlines.Add(" ");
        }

        tb.Inlines.Remove(tb.Inlines.Last());
    }
    else
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(fe); ++i)
        {
            CreateLinks(VisualTreeHelper.GetChild(fe, i) as FrameworkElement);
        }
    }
}

public MainWindow()
{
    InitializeComponent();

    Loaded += (s, a) =>
        {
            FrameworkElement root = XamlReader.Parse("<Grid xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"><TextBlock>Click Click Clock Clack Click</TextBlock></Grid>") as FrameworkElement;

            CreateLinks(root);

            grid.Children.Add(root);
        };
}

当然,您可能希望更加精细,以确保您保持文本的确切格式;由于我的快速和肮脏的实现,我将失去连续的空间,并且我不会处理模式包含空格的情况。

所以你可以使用正则表达式来增强它,但就WPF而言,我认为你拥有自己实现的所有元素。

享受!