什么时候x:静态类型转换器评估:运行时或编译时?

时间:2011-04-12 15:25:10

标签: c# wpf markup-extensions

我有一个wpf应用程序,我开始本地化它。我选择的本地化策略是创建我的自定义MarkupExtension类。

我不会使用.res文件,因为在我的公司有一个已经制作的解决方案,它创建了一个包含所有字符串的加密地图,并且需要使用int键来引用每个字符串。所以我编写了一个自定义生成器,它使用所有'int'键创建一个枚举(可以是一个带有整数的静态类,它并不重要)。

所以我想在我的XAML文件中引用每个枚举键,执行:

<Label Content="{l:Translator {x:Static l:TranslatedEnums.MainWindow_WelcomeMessage}}" />

创建的枚举为TranslatedEnums,我的翻译类名为Translator(dhu)。

但在阅读x:静态documentationtype converters documentation之后,我想到了以下问题:

“编译的xaml”(baml)是否在运行时或编译时实际评估了这些类型中的每一种(通过x:Static)?

我问这个是因为我静态引用枚举值的原因之一是我没有确切的枚举字符串键,而是它的值,这会使应用程序被黑客攻击一点点更难。

如果解析是在运行时完成的,那么我可以将之前的代码缩小到:

<Label Content="{l:Translator MainWindow_WelcomeMessage}" />

这需要我自己查找枚举值,但这是一个单行:

TranslatedEnums result;
Enum.TryParse(key, out result);

哪会使Xaml代码更小(哪个好),但如果密钥不存在(这不是问题),它会在编译时失败。

1 个答案:

答案 0 :(得分:2)

实际上是在xaml加载时(如here所述)。如果你只加载你的xaml onece,你可以在运行时考虑它。