سؤال

أرغب في تحديث نمط النافذة الافتراضي ديناميكيًا في وقت التشغيل حتى أتمكن من تغيير الحجم والخطوط ديناميكيًا في وقت التشغيل. لقد وجدت أن الأنماط في قاموس الموارد الخاص بك مغلقة في وقت التشغيل ولا يمكن تغييرها ، لذلك استخدمت الطريقة التالية لتحديث النمط:

<Style TargetType="{x:Type Window}">
    <Setter Property="FontFamily" Value="Arial"/>
    <Setter Property="FontSize" Value="12pt"/>
</Style>

مع الكود التالي:

Style newStyle = (Make a copy of the old style but with the FontSize and FontFamily changed)

// Remove and re-add the style to the ResourceDictionary.
this.Resources.Remove(typeof(Window));
this.Resources.Add(typeof(Window), newStyle);

// The style does not update unless you set it on each window.
foreach (Window window in Application.Current.Windows)
{
    window.Style = newStyle;
}

هناك العديد من المشكلات في هذا النهج ولدي بعض الأسئلة حول سبب كون الأمور هي الطريقة التي هي.

  1. لماذا يتم إغلاق الأنماط في وقت التشغيل وهل هناك طريقة لجعلها غير محفوظة؟
  2. عندما أعيد إضافة النمط الجديد ، لماذا لا يتم التقاط هذا من قبل جميع النوافذ الخاصة بي؟ لماذا يجب أن أذهب وتطبيقه يدويًا على كل نافذة؟
  3. هل هناك طريقة أفضل؟
هل كانت مفيدة؟

المحلول

من المحتمل أن أتعامل مع هذا مع "خدمة الإعدادات" التي تكشف خصائص الإعدادات المختلفة ، والحرائق INPC كما تفعل للربط العادي. بعد ذلك ، سأغير هذا النمط ليكون شيئًا مثل:

<Style x:Key="MyWindowStyle">
    <Setter Property="FontFamily" Value="{Binding Path=FontFamily, Source={StaticResource SettingsService}, FallbackValue=Arial}"/>
    <Setter Property="FontSize" Value="{Binding Path=FontSize, Source={StaticResource SettingsService}, FallbackValue=12}"/>
</Style>

مع "خدمة الإعدادات" الخاصة بك المحددة كمورد ثابت:

<services:SettingsService x:Key="SettingsService"/>

ثم في كل نافذة ، تأكد من تعيين النمط على أنه DynamicResource:

<Window Style="{DynamicResource MyWindowStyle}" .... >

غالبًا ما يكون هناك الكثير من سوء الفهم حول الاختلافات بين الموارد الثابتة والديناميكية ، ولكن الفرق الأساسي هو ثابت هو إعداد "مرة واحدة" في حين أن الديناميكي سوف يقوم بتحديث الإعدادات إذا تغير المورد.

الآن إذا قمت بتعيين هذه الخصائص في "خدمة الإعدادات" الخاصة بك ، فسوف يقومون بإطلاق INPC ، والتي ستقوم بتحديث النمط ، والتي ستقوم بها DynamicResource على خصائص النافذة وتغييرها وفقًا لذلك.

يبدو أن الكثير من العمل ، لكنه يمنحك بعض المرونة اللطيفة ، ويتم كل "الرفع الثقيل" باستخدام الروابط البحتة. نحن نستخدم تقنية مماثلة في مشروع أعمل عليه في الوقت الحالي ، لذلك عندما يختار المستخدم لون ملء/السكتة الدماغية ، فإن الأدوات المختلفة في تحديث شريط الأدوات لتعكس القيم الجديدة.

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