2016-12-31 83 views
2

我有一個應用程序,用戶可以通過添加自己的xaml文件來定義自定義元素。這些文件在啓動時由應用程序加載。這個想法是能夠擴展應用程序而不必重新編譯它。這些元素將在屏幕上向用戶顯示,並且xaml文件可能包含未包含在應用程序本身的resx文件中的資源鍵。所以我有一個要求,用戶可以編輯單獨的resx文件,也將在運行時加載。在C#中運行時使用外部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

經過漫長的搜索,我發現這個: 如果我以正確的方式理解你,你想在運行時使用xaml在WPF中創建用戶定義的窗體。 我不確定但是,我認爲資源文件不會幫助你,因爲所有的xaml表單都是在程序集中預編譯的。我發現了一些可能聽起來像是解決問題的方法。它被稱爲Sattalite大會。在第一步中,您必須創建一個新的資源文件。第二步是將其與彙編鏈接器(Al.exe)鏈接。形式.net框架。 MSDN Creating Satellite Assemblies

第一步在運行時創建一個的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(); 

      } 

第二步從資源文件中創建一個Sattlelite大會與議會鏈接Al.exe工具

最後一步是加載從Sattalite大會(這裏一點幫助)

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 XAML形式: 資源文件 - 參照的文CED裝配Pack URIs in WPF

Uri uri = new Uri("/ReferencedAssembly;component/ResourceFile.xaml",UriKind.Relative); 

這裏,因爲我認爲Construct XAML Forms at Runtime with Resource Files

這是所有我發現你和functionallity不能保證一些有用的信息。 我感興趣,如果這將適用於你,所以請發送成功的答案或如果你解決了你的問題。

PS .:如果這個工程我認爲你只需要重新啓動你的主應用程序來加載新的sattalite程序集。也許你必須啓動一個完成這項工作的ohter應用程序,並在完成後再次自動啓動你的主應用程序。

Best regouards GatewayToCode