سؤال

أقوم بتطبيق WPF الذي سيكون له العديد من الجلود التي يحملها نظام البناء لدينا. من الناحية المثالية ، نود أن يدرج التطبيق من الجلود المتاحة لأن بعض البناء سيكون لها واحدة للعديد من الجلود.

في وقت التشغيل ، هل هناك طريقة لتعداد جميع قواميس الموارد في مجلد معين؟

أريد تجنب ترميز أسماء ملفات XAML في CodeBehind لأن هذا هو الموقف المتغير.

هل كانت مفيدة؟

المحلول

نوعا ما.

يمكنك تعداد جميع ملفات BAML (المترجمة XAML) على النحو التالي:

  var resourcesName = assembly.GetName().Name + ".g";
  var manager = new System.Resources.ResourceManager(resourcesName, assembly);
  var resourceSet = manager.GetResourceSet(CultureInfo.CurrentUICulture, true, true);
  var allXamlFiles =
    from entry in resourceSet.OfType<DictionaryEntry>()
    let fileName = (string)entry.Key
    where fileName.EndsWith(".baml")
    select fileName.Substring(0, fileName.Length-5) + ".xaml";

لا توجد طريقة لمعرفة أي منها من هذه الموارد وأي XAML أخرى مثل Windows أو UserControls دون تحميلها فعليًا. لذا فإن الإجابة على سؤالك المباشر هي "لا" إلا إذا قمت بتحميل كل XAML تجدها للتحقق مما إذا كانت موارد. سيكون هذا بطيئًا جدًا.

من ناحية أخرى ، إذا كنت على استعداد لاستخدام مخطط التسمية لبرنامج الموارد الخاص بك ، فيمكنك تعداد جميع BAMLs في التجميع الخاص بك واختيار أيهما يتطابق مع مخطط التسمية الخاص بك ، والثقة في مواردهم. ما عليك سوى تمديد جملة "حيث" في الاستعلام أعلاه.

لذلك الجواب هو "نوع من".

نصائح أخرى

هنا حل وجدته @ microsoft

WPF يلف ResourceDictionary في "Assembly.g.resources" ، يمكننا الحصول على اسم المورد "Assembly.g.resources" GetManifestResourceNames(). بعد ذلك يمكننا استخدام ResourceReader الفصل لقراءة المورد من ResourceStream.

 foreach (string str in Application.ResourceAssembly.GetManifestResourceNames()){
txt.Text += str + "\n";
 {
  Stream st = Application.ResourceAssembly.GetManifestResourceStream(str);
  using (ResourceReader resourceReader = new ResourceReader(st))
  {
   foreach (DictionaryEntry resourceEntry in resourceReader)
   {
    txt.Text +="\t: "+ resourceEntry.Key + "\n";
   }
  }
 }
}

الجواب الثاني

يمكنك استخدام Assembly.Load() لتحميل التجميع الخارجي وقراءة قواميس الموارد منه.

Assembly assembly = Assembly.Load("Assembly Name String"); 
foreach (string str in assembly.GetManifestResourceNames())
{
 {
  Stream st = assembly.GetManifestResourceStream(str);
  using (ResourceReader resourceReader = new ResourceReader(st))
  {
   foreach (DictionaryEntry resourceEntry in resourceReader)
   {
    .....
   }
  }
 }
}

يمكنك إضافة موارد في وقت التشغيل.

Resources.MergedDictionaries.Add(...)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top