我的应用程序使用MarkupExtensions来完成用户界面的自动翻译。这在运行时非常好,但在设计时并不适用。通常情况下这不是一个大问题,但是一旦你有大约40个绑定到翻译的控件,你就会看到40个错误,它们说"对象没有设置为实例。"因为翻译器没有实例化。此外,如果有翻译文本而不是"!keyname!",看看它实际上看起来真的很高兴。这有助于显着地设计用户界面。
不幸的是,我的应用程序是非常抽象和模块化的,因为我不想参考本地化程序集,我不得不做一些讨厌的技巧来启用设计时翻译。
一个类始终在使用中,并且在设计时可以安全使用。它是可以访问所有内容的Core(包括本地化程序集,但在设计时不会实例化)。所以我在Core的静态构造函数中添加了一些代码,它们查找程序集并通过Reflection / Expressions创建Translator。这显然有效,因为我在译者的构造函数中出现了异常。
但是当我尝试将转换器的实例分配给Core中的属性时,后者将用于创建设计时转换绑定,我必须注意到没有实例集。创建MarkupExtensions后,我得到一个异常,它告诉我没有设置DesignTimeTranslator。
我无法弄清楚为什么会发生这种情况,而且由于这种情况在设计时运行,我无法调试好。我对表达式的了解并不多,所以我不知道当它们执行失败时会发生什么,也不知道实际输出应该是什么(但我想它应该是ITranslator)。
if (!DesignerProperties.GetIsInDesignMode(new DependencyObject())) return;
try
{
Assembly locA = Assembly.Load(
AssemblyName.GetAssemblyName(Path.Combine(Environment.CurrentDirectory,
"Localization.dll")));
if (locA == null) throw new Exception("No DesignTimeTranslator assembly found.");
Type locT = locA.GetType("Localization.Translator");
if (locT == null) throw new Exception("DesignTimeTranslator type not found.");
ConstructorInfo constructorInfo = locT.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance,
null, Type.EmptyTypes, null);
if (constructorInfo == null) throw new Exception("No constructor found for DesignTimeTranslator.");
NewExpression constrExp = Expression.New(constructorInfo);
Func<object> constructor = Expression.Lambda<Func<object>>(constrExp, null).Compile();
DesignTimeTranslator = (ITranslator)constructor();
MessageBox.Show(DesignTimeTranslator != null ? DesignTimeTranslator.GetType().FullName : "No Translator :(");
}
catch (Exception ex)
{
MessageBox.Show("[DESIGNTIME] Exception occured: {0}{1}".FormatWith(ex.Message, ex.StackTrace));
MessageBox.Show(Path.Combine(Environment.CurrentDirectory,
"Localization.dll"));
}
这是译者的构造函数:
internal Translator()
{
bool designTime = DesignerProperties.GetIsInDesignMode(new DependencyObject());
if (_instance != null) throw new InvalidOperationException("Can´t create another Translator instance!");
_instance = this;
this._languagePacks = new Dictionary<CultureInfo, LangFormat>();
}
谢谢:)