我有一个DLL中的用户控件Controls
,在DLL中的转换器Base
的DLL和语言资源的Languages
。
当我一切都结合以下方式,一切工作正常:
<Label Content="{Binding FallbackValue='[Design] Name', ConverterParameter='Name', Converter={StaticResource Translate}}"
ContentStringFormat="{}{0}:"/>
没有错误,当我运行我的应用程序的参数正确的单词Name
被加载(在我的情况纳摩荷兰)。
我也试试这个对我WatermarkTextBox
是这样的:
<c:WatermarkTextBox Watermark="{Binding FallbackValue='[Design] Name *', ConverterParameter='Name', Converter={StaticResource Translate}}" />
但后来我得到以下错误:
无法加载文件或程序集“文件:/// C:\ Languages.dll”或它的一个依赖。 该系统找不到指定的文件。
为什么会出现这种情况与我WatermarkTextBox
在Controls
DLL而不是与Label
?
这里的第一步是确保,大会文件Languages.dll
是在应用程序目录中实际存在(通常bin/Debug/
)。 如果不是-作为错误信息说-系统无法找到指定的文件......在这种情况下的解决方法是引用的程序集Languages.dll
在您的应用程序项目。 为了避免这种情况,请确保你每次添加一个引用到一个组件,同时也增加了引用该组件的依赖关系。 也就是说,如果你有一个应用程序项目App
它引用库LibA.dll
和LibA
引用库LibB.dll
,你应该添加一个参考LibB.dll
在你的App
的项目也是如此。 这样一来,所有必需的组件将始终被复制到输出目录。
如果组件正确位于输出目录,但你仍然得到错误信息,在99%的情况的问题是在建设目标不匹配,唉为其组件建成的平台。 确保所有项目针对同一平台(x86的,例如)。 您可以检查目标在项目属性选项卡。
编辑:
好吧,我刚才了解你谈论在Visual Studio中的XAML设计师设计时间错误:)问题是组件的名称: Noru.Languages.dll
。 我想,结束.Languages
被认为是一个资源名称和Visual Studio中的程序集名称禁止资源名称。 有一个注册表项HKLM\Software\Microsoft\VisualStudio\12.0\Designers\AllowResourcesInFilename
,也许与试验可以解决该问题。 不是100%肯定,但。 无论如何,如果你重命名大会Nori.Language.dll
项目的属性和重建一切,设计时支持是背部和控件在设计正确显示。
编辑2:
真是奇怪的行为完全...嗯,这条线在类Language
很可能是原因? 尝试在这里指定满弦......工作的呢?
ResourceManager rm = new ResourceManager("Noru.Languages.Language", System.Reflection.Assembly.LoadFrom("Noru.Languages.dll"));
编辑3:
显然,这个问题是我在编辑2.上述行我已经试验了一下:
/// <summary>
/// Will return the requested text in the language the application is in. Case sensitive.
/// </summary>
/// <param name="s">Provide a listed String from the language files.</param>
/// <returns>Will return a System.String in the language of the application.</returns>
public static string GetText(string s)
{
//return Culture.ToString();
//return Assembly.GetExecutingAssembly().FullName;
//ResourceManager rm = new ResourceManager("Noru.Lang.Resource1", Assembly.GetAssembly(typeof(Language)));
//ResourceSet rs = rm.GetResourceSet(Culture, true, true);
var rs = LanguageResource.ResourceManager;
try
{
return rs.GetString(s);
}
catch (Exception)
{
return "not found";
}
}
最后一个版本(不注释掉)的作品,因为我已经通过设置生成的资源文件的代码AccessModifier
在资源编辑器公共(双击资源文件,你会在工具栏中找到它)。
这个版本(从不介意资源的名称,我尝试了不同的版本在这里):
ResourceManager rm = new ResourceManager("Noru.Lang.Resource1", Assembly.GetAssembly(typeof(Language)));
抛出另一个错误,称它无法找到组件内部的资源。 我觉得有什么错的使用ResourceManager
这里。 我不是专家,所以我不知道为什么。 我只知道,最后的版本似乎按预期工作......我希望,你会发现相同;)