x:Static 类型转换器何时进行评估:运行时还是编译时?
我有一个 wpf 应用程序,我开始对其进行本地化。我选择的本地化策略是创建自定义 MarkupExtension 类。
我不会使用 .res 文件,因为在我的公司已经有一个解决方案,它创建一个包含所有字符串的加密映射,并且需要 int 键来引用每个字符串。所以我编写了一个自定义生成器,它创建一个带有所有“int”键的枚举(可能是带有整数的静态类,这并不重要)。
因此,我想在我的 XAML 文件中引用每个枚举键,执行以下操作:
<Label Content="{l:Translator {x:Static l:TranslatedEnums.MainWindow_WelcomeMessage}}" />
创建的枚举是 TranslatedEnums
,我的翻译器类称为 Translator
(dhu)。
但阅读 x:Static 文档 和类型转换器文档,我想到了以下问题:
“编译的 xaml”(baml) 实际上是否在运行时或编译时评估每种类型(通过 x:Static)?
我问这个是因为我提到的原因之一枚举值是静态的,因此我没有确切的枚举字符串键,而是它的值,这将使破解应用程序变得更加困难。
如果解析是在运行时完成的,那么我可以将之前的代码缩小为:
<Label Content="{l:Translator MainWindow_WelcomeMessage}" />
这将需要我自己查找枚举值,但这是一行:
TranslatedEnums result;
Enum.TryParse(key, out result);
这将使 Xaml 代码更小(这很好) ,但如果密钥不存在(这不是问题),它会在编译时失败。
I have a wpf application and I'm starting to localize it. The strategy for localization I chose was to create my custom MarkupExtension class.
I won't be using the .res files since at my company there is a solution that is already made which creates an encrypted map with all the strings and it requires int keys to refer to each string. So I wrote a custom generator that creates an enum with all the 'int' keys (could be a static class with ints, it doesn't really matter).
So I want to refer to each of these enum keys at my XAML files, doing:
<Label Content="{l:Translator {x:Static l:TranslatedEnums.MainWindow_WelcomeMessage}}" />
The created enum is TranslatedEnums
and my translator class is called Translator
(dhu).
But after reading the x:Static documentation and the type converters documentation, the following question came to my mind:
Does the "compiled xaml" (baml) actually evaluates each of these types (via x:Static) at runtime or compile-time?
I'm asking this because one of the reasons I'm referring to the enum value statically is so that I don't have the exact enum string key, but rather it's value, which would make hacking the application a little bit harder.
If the resolution is done at runtime, then I could narrow my previous code to:
<Label Content="{l:Translator MainWindow_WelcomeMessage}" />
Which would require the lookup for the enum value by my own, but this is a one-liner:
TranslatedEnums result;
Enum.TryParse(key, out result);
Which would make the Xaml code smaller (which is good), but it would fail at compile-time if the key didn't exist (which is not a problem).
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
它实际上是在 xaml 加载时(如此处所述) )。如果您只加载一次 xaml,则可以在运行时考虑它。
It's actually at xaml load-time (as stated here). if you only load your xaml onece, you could consider it at run-time.