带有超链接的WPF Resources.resx字符串?

时间:2011-01-28 13:11:07

标签: c# wpf xaml

我想拥有一个字符串资源,其中包含一个超链接。我想这是不可能的,除非我有4个资源字符串:

预超链接文字 超链接href 超链接文本 超链接文本。

然后通过以下方式在xaml中构建它:

<StackPanel Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Top" HorizontalAlignment="Right">
    <TextBlock Grid.Column="1" Text="{x:Static p.Resources.PreHText}" />
    <Hyperlink Grid.Column="1" NavigateUri="{x:Static p.Resources.HHref}">
    <TextBlock Text="{x:Static p.Resources.HText}" /></Hyperlink></TextBlock>
    <TextBlock Grid.Column="1" Text="{x:Static p.Resource.PostHText}" />
</StackPanel>

由于很多原因(造型,不是非常动态等等),这很糟糕。栏创建我自己的渲染和字符串格式,例如“请发送电子邮件至{me@there.com |帮助台}以获得进一步的帮助”。有没有其他方法来实现这一目标? (不必使用resources.resx文件)

1 个答案:

答案 0 :(得分:1)

最后我只是为它创建了自己的文本块控件(Imaginitively named AdvancedTextBlock):

    public class AdvancedTextBlock : TextBlock {
        new private String Text { get; set; } //prevent text from being set as overrides all I do here.
        private String _FormattedText = String.Empty;
        public String FormattedText {
            get { return _FormattedText; }
            set { _FormattedText = value; AssignInlines(); }
        }
        private static Regex TagRegex = new Regex(@"\{(?<href>[^\|]+)\|?(?<text>[^}]+)?}", RegexOptions.Compiled);

        public AdvancedTextBlock() : base() { }
        public AdvancedTextBlock(System.Windows.Documents.Inline inline) : base(inline) { }

        public void AssignInlines(){
            this.Inlines.Clear();
            Collection<Hyperlink> hyperlinks = new Collection<Hyperlink>();
            Collection<String> replacements = new Collection<String>();
            MatchCollection mcHrefs = TagRegex.Matches(FormattedText);
            foreach (Match m in mcHrefs) {
                replacements.Add(m.Value);
                Hyperlink hp = new Hyperlink();
                hp.NavigateUri = new Uri(m.Groups["href"].Value);
                hp.Inlines.Add(m.Groups["text"].Success ? m.Groups["text"].Value : m.Groups["href"].Value);
                hp.RequestNavigate += new RequestNavigateEventHandler(hp_RequestNavigate);
                hyperlinks.Add(hp);
            }
            String[] sections = FormattedText.Split(replacements.ToArray(), StringSplitOptions.None);
            hyperlinks.DefaultIfEmpty(null);
            for (int i = 0, l = sections.Length; i < l; i++) {
                this.Inlines.Add(sections.ElementAt(i));
                if (hyperlinks.ElementAtOrDefault(i) != null) {
                    this.Inlines.Add(hyperlinks[i]);
                }
            }
        }

        void hp_RequestNavigate(object sender, RequestNavigateEventArgs e) {
            RequestNavigate(sender, e);
        }

        //
        // Summary:
        //     Occurs when navigation events are requested.
        public event RequestNavigateEventHandler RequestNavigate;
    }

对我的实施我不太满意的唯一两件事是:

A)我不得不破解现有的Text属性,因为我不知道如何防止该属性覆盖我所做的事情

B)(与 A 相关)每次AssignInlines字段设置时我都必须致电FormattedText(这应该只是一次性的),但这又是,直到不知道如何挂钩实际显示的东西的方法(期待找到PreRender,渲染事件或类似,但我不能),所以如果有人知道如何,那' d太棒了:)。