سؤال

لديّ قواعد ومستخدمين متعددين في DLL منفصلة عن تطبيق WPF الخاص بي.

اعتمادًا على من يستخدم التطبيق ، سيتم دمج الجلد الأساسي وأحد جلود المستخدم في قاموس الموارد وتحميله لاستخدام التطبيق.

ما أهدف إليه هو القدرة على تحديد نمط في ملف قواعد ، ثم على ملف مستخدمي معين ، تكون قادرًا على تجاوزه ، وتغيير أي خصائص أحتاج إليها.

أعلم أنه يمكنني تحقيق ذلك باستخدام السمة المستندة إلى هذا:

قاعدة:

<Style x:Key="ButtonBg" TargetType="{x:Type Button}">
    <Setter Property="Background" Value="Green"/>
</Style>

المستعمل:

<Style x:Key="CustomButtonBg" TargetType="{x:Type Button}" BasedOn="{StaticResource ButtonBg}">
    <Setter Property="Background" Value="Blue"/>
</Style>

المشكلة هي أن العناصر الآن يجب أن يكون لها نمط من CustomButtonBG والتي قد لا يتم تنفيذها بالفعل. هل هناك أي طريقة لاستخدام كلا الأنماطين استخدام نفس المفتاح (buttonBG) ، وعندما يتم دمجها ، اطلب من التطبيق أن يبحث عن نمط يسمى buttonbg في المستخدم أولاً ، وإذا لم يكن هناك أحد ، فاستخدم تلك الموجودة في القاعدة؟

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

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

المحلول

يمكنك محاولة الاستفادة من منطق البحث في الموارد. عندما تحاول WPF العثور على مورد بواسطة المفتاح ، فإنه ينظر أولاً إلى العنصر الحالي ResourceDictionary, ثم والديها ، ثم والد ذلك ، وهلم جرا.

لذلك بما أنك قلت إنه مشروط للمستخدم ، يمكن دمج ذلك في ResourceDictionary في ال Window المستوى بينما قاعدتك الأصلية في Application مستوى.

يحرر: لدي معلومات أفضل. من MSDN على القواميس المدمجة:

سلوك القاموس المدمج

تشغل الموارد الموجودة في القاموس المدمج موقعًا في نطاق البحث في الموارد الذي يبعد مباشرة نطاق قاموس الموارد الرئيسي الذي يتم دمجه فيه. على الرغم من أن مفتاح الموارد يجب أن يكون فريدًا من نوعه في أي قاموس فردي ، إلا أنه يمكن أن يوجد مفتاح عدة مرات في مجموعة من القواميس المدمجة. في هذه الحالة ، سيأتي المورد الذي يتم إرجاعه من القاموس الأخير الموجود بالتتابع في مجموعة DergedDictionaries. إذا تم تعريف مجموعة DistedDictionaries في XAML ، فإن ترتيب القواميس المدمجة في المجموعة هو ترتيب العناصر على النحو المنصوص عليه في الترميز. إذا تم تحديد مفتاح في القاموس الأساسي وأيضًا في القاموس الذي تم دمجه ، فإن المورد الذي يتم إرجاعه سيأتي من القاموس الأساسي. تنطبق قواعد النطاق هذه بالتساوي على كل من مراجع الموارد الثابتة ومراجع الموارد الديناميكية.

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

نصائح أخرى

قد تقوم فقط بتسمية قاعدتك على أنها baseButtonBG وعندما لا تندمج ، قم بدمج نظام الموارد المستند إلى المستخدم ، وهو ما يحتوي على:

<Style x:Key="ButtonBg" TargetType="{x:Type Button}" BasedOn="{StaticResource BaseButtonBg}"/>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top