【发布时间】:2018-01-17 08:19:08
【问题描述】:
我正在尝试创建自己的 MarkupExtension 进行本地化。想法是将资源的名称(例如“Save”)传递给标记扩展,然后返回本地化值(例如 en-US 中的“Save”,de-de 中的“Speichern”等) .
这很好用,但我无法让它与智能感知一起工作。
这是我简化的 MarkupExtension 类:
public class MyMarkupExtension : MarkupExtension
{
private readonly string _input;
public MyMarkupExtension(string input)
{
_input = input;
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
// Here the actual value from the resources will be returned, for example for input 'Save':
// 'Save' for Thread.CurrentThread.CurrentUICulture="en-US"
// 'Speichern' for Thread.CurrentThread.CurrentUICulture="de-de"
// ...
return Resources.ResourceManager.GetString(_input);
}
}
还有xaml:
<TextBox Text="{m:MyMarkup Save}"></TextBox> <!-- No Intellisense, but it works. -->
<TextBox Text="{m:MyMarkup {x:Static properties:Resources.Save}}"></TextBox> <!-- Intellisense works, but the input parameter for markup extension is already localized string -->
知道在 xaml 中使用什么,以便标记扩展的输入是文字字符串(在我的示例中为“Save”,它是资源名称,而不是本地化值)并且智能感知可以工作?
【问题讨论】:
-
你说的“让它工作”是什么意思? 如何它现在不起作用?
-
@grek40:“让智能感知工作” - 现在我必须知道资源的名称,例如“保存”。我也可以输入错误并写'Svae'并且不会得到任何编译器错误。但是,如果您使用 x:Static 为例,那么我可以编写 'properties:' 并且智能感知会自动提供所有可能的值,包括 'Save'。
-
最简单的解决方案当然是简单地设置
Text="{x:Static properties:Resources.Save}"。这可以通过一些战略命名来缩短一点,但自定义标记扩展似乎完全没有必要。有关详细信息,请参阅我的答案。此外,无论您喜欢哪种解决方案,您都应该在奖励到期之前奖励某人。 -
如果您想要实现本地化,那么为什么不使用已经发明的东西:docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/…?
标签: c# .net wpf xaml markup-extensions