我有一个应用程序,用户可以通过添加自己的xaml文件来定义自定义元素。这些文件在启动时由应用程序加载。我们的想法是能够扩展应用程序而无需重新编译它。这些元素将在屏幕上显示给用户,xaml文件可能包含资源键,这些资源键不包含在应用程序本身的resx文件中。所以我需要有单独的resx文件供用户编辑,也可以在运行时加载。
我查看过ResourceManager类,我知道可以将其设置为从各种其他程序集中访问资源。但是从我收集到的资源中,资源必须是集会的一部分,这正是我不想要的。我想要的是拥有一堆这样的文件:
%ProgramData%\ MyApplication的\资源\ strings.resx
%ProgramData%\ MyApplication的\资源\ strings.de-DE.resx
%ProgramData%\ MyApplication的\资源\ strings.zh-CN.resx
我希望我的应用程序能够加载这些文件并访问其中的字符串。
本文https://msdn.microsoft.com/en-us/library/gg418542(v=vs.110).aspx显示了使用ResXResourceReader和ResXResourceSet的两种方法。但是,似乎这些类采用特定文件(或流)的路径,因此无法根据当前文化和命名约定选择正确的文件。我知道我可以自己编写代码,如果我找不到更好的解决方案,那就是我要做的事情。但理想情况下,我想要一些可以解决这个问题的方法。例如,如果可以将ResourceManager指向文件夹而不是程序集。这样的事情可能吗?
答案 0 :(得分:0)
第一步在运行时创建一个ResourceFile(这里有点帮助)
public static void CreateResourceFile()
{
string resourceFileName = "externeresource";
System.Xml.XmlDocument xmldoc = new XmlDocument();
XmlTextReader reader = new XmlTextReader("/runtimeWPForm.xml");
reader.WhitespaceHandling = WhitespaceHandling.None;
xmldoc.Load(reader);
ResourceWriter resourceWriter = new ResourceWriter(resourceFileName);
/*Add XmlDocument must be Serializable to store it in
resourceWriter.AddResource("xamlgrid", xmldoc.ToString());
the Resource, so i stored a String here. (not testet)*/
resourceWriter.Close();
MessageBox.Show("File " + resourceFileName + " created");
reader.Close();
}
第二步,使用Assembly Linker Al.exe从资源文件创建Sattlelite程序集
最后一步是从Sattalite Assembly加载xaml Forms(这里有点帮助)
Uri GridUri = new Uri(/*Note1*/, UriKind.Relative);
Windows.Resources.StreamResourceInfo sri = Application.GetResourceStream(GridUri);
System.Windows.Markup.XamlReader xrdr = new System.Windows.Markup.XamlReader();
Grid grd = (Grid)xrdr.LoadAsync(sri.Stream);
this.Content = grd;
注1: 资源文件 - 引用程序集Pack URIs in WPF
Uri uri = new Uri("/ReferencedAssembly;component/ResourceFile.xaml",UriKind.Relative);
这里有一些有用的信息,我想Construct XAML Forms at Runtime with Resource Files
这是我找到的所有内容,并不保证功能。 我很感兴趣,如果这对您有用,请发送成功答案或者您是否解决了问题。
PS。:如果这样可行,我认为您只需重新启动主应用程序即可加载新的sattalite组件。也许你必须启动一个执行该工作的ohter应用程序,并在完成后再次自动启动主应用程序。
最好的reg GatewayToCode