الموارد الديناميكية على مستوى التطبيق ليست ديناميكية عند المستضاف في Elementhost

StackOverflow https://stackoverflow.com/questions/727141

سؤال

أنا أستضيف WPF Usercontrol في حاوية WinForms. الآن، أريد أن أكون قادرا على الموضوع / الجلد The Usercontrol. للقيام بذلك، لدي العديد من قواميس الموارد التي تحدد "الجلود". عندما يبدأ تطبيقي بإنشاء "System.Windows.Application" جديد () "حتى يكون هذا التطبيق. لتغيير السمة تتم إزالة الجلد القديم ويتم دمج الجلد الجديد في قاموس مورد مستوى التطبيق في وقت التشغيل. ومع ذلك، فإن هذا لا يغير أي من الموارد المشار إليها بواسطة Dyanamically في UserControl. حاولت هذا في تطبيق WPF مستقيم وعمل على ما يرام. هل أنا أفتقد شيئا ما، أم أنه من الممكن القيام بذلك على الإطلاق؟ بالمناسبة، إذا أضفت جلد إلى موارد التطبيق قبل تهيئة UserControl، فسوف تعمل ولكن لا يمكنني تغيير الجلد بعد ذلك.

لإعادة الريبو هذا بالطريقة الأساسية:

إنشاء تطبيق WinForms جديد. إضافة WPF UserControl إلى التطبيق. هذا بسيط بما فيه الكفاية:

<UserControl ...>
   <Grid>
      <Button
         Background="{DynamicResource ButtonBG}"/>
   </Grid>
</UserControl>

قم بإنشاء اثنين من الموارد، White.xaml و Black.xaml (أو أيا كان) يحتوي على solidcolorbrush مع مفتاح buttonbg مع اللون المعني. في form1.cs، أضف أزرارين ونسي. قم بتعيين طفل Elementhost إلى مثيل UserControl الذي أنشأناه للتو. الأسلاك حتى الأزرار إلى الأحداث التي تبادل الجلد:

private void White_Click(object sender, EventArgs e)
{
   Application.Current.Resources.MergedDictionaries[0] = 
      (ResourceDictionary)Application.LoadComponent(
         new Uri(@"\WpfThemes;component\White.xaml", UriKind.Relative)));
}

private void Black_Click(object sender, EventArgs e)
{
   Application.Current.Resources.MergedDictionaries[0] = 
      (ResourceDictionary)Application.LoadComponent(
         new Uri(@"\WpfThemes;component\Black.xaml", UriKind.Relative)));
}

في البرامج. C، تأكد من أن التطبيق. القضيب موجود ووضع الجلد الأولي:

[STAThread]
static void Main()
{
   new System.Windows.Application();

   Application.Current.Resources.MergedDictionaries[0] =
      (ResourceDictionary)Application.LoadComponent(
         new Uri(@"\WpfThemes;component\White.xaml", UriKind.Relative)));

   ...
}

الآن، عند النقر فوق الزر الأبيض أتوقع أن أتحول الزر الموجود في UserControl إلى اللون الأبيض وعندما يتم النقر فوق الزر الأسود وأتوقع أن يتحول الزر إلى اللون الأسود. هذا لا يحدث، ولكن.

هل يعرف أحد لماذا؟ هل هناك حل؟

يحرر: الفكرة: ربما، إذا كان هناك طريقة لفرض إعادة تقييم Dynamicresources عندما يتغير الموضوع، من شأنها أن تعمل.

شكرا يا مغربي

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

المحلول

أعتقد أن هذا قد يكون مشكلة تجاهل في إطار WPF.

من ما يمكنني معرفةه عبر العاكس، يبدو أنه عندما Application تم تغيير قاموس الموارد كارثية (تغيير من المحتمل أن يكون له تأثيرات واسعة النطاق مثل إضافة أو إزالة أو استبدال الجلد)، هناك كود حلقات على كل من Windows في التطبيق ويؤديهم لإعادة تقييمهم DynamicResources. وبعد ومع ذلك، العناصر الأخرى التي سأعتبرها افضل مستوى في WPF مثل ElementHostلا تحصل على نفس العلاج. هذا يؤدي إلى السلوك الذي أعاني منه.

الحل البديل لهذه القضية هو أن يذهب يدويا من خلال كل ما ElementHostق فردي وإضافة، إزالة، أو استبدال الجلد ResourceDictionary ملف. انها ليست مثالية، لكنها تنجز المهمة.

نصائح أخرى

سيكون هناك حل آخر هو إنشاء نافذة دمية وتحديد محتوى Elementhost كحتوى. إذا نظرت إلى التطبيق وتحقق من كيفية معالجة التغييرات في ResourceTionaries، فإنك ترى أنه يخطر فقط بنظام Windows ..

الشيء الوحيد الذي يجب أن تذكره هو عدم إظهار النافذة (-> الاستثناء) وإغلاقه عند التخلص من النسيان، لذلك يمكن للتطبيق إيقاف التشغيل بشكل صحيح.

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