我想拥有一个字符串资源,其中包含一个超链接。我想这是不可能的,除非我有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文件)
答案 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太棒了:)。