(WPF) كيفية تعيين قيمة sys: double to systemfonts.messagefontsize من الموارد؟
-
23-09-2019 - |
سؤال
سيناريو:
أرغب في استخدام 3 حجم خط قياسي لتطبيق WPF الخاص بي: BigFontSize
, NormalFontSize
, ، و SmallFontSize
. هذه قيم مزدوجة ويتم تعريفها في قاموس الموارد على أنها (حيث sys
محدد بشكل مناسب):
<sys:Double x:Key="BigFontSize">18</sys:Double>
<sys:Double x:Key="NormalFontSize">14</sys:Double>
<sys:Double x:Key="SmallFontSize">12</sys:Double>
هذا يعمل بشكل جيد. لكنني اخترت بشكل عشوائي 14 كحجم طبيعي. ما أريده هو الحصول على حجم الخط المحدد للنظام NormalFontSize
. (إذا تم ذلك ، يمكنني استخدام محول كما وصفت هنا لتأخذ، لتمتلك BigFontSize
و SmallFontSize
على صلة قربى ب NormalFontSize
)
فكرة :
لقد وجدت من الوثائق أن حجم الخط الافتراضي يتم تخزينه في خاصية ثابتة (مزدوجة) SystemFonts.MessageFontSize
. ولكن ماذا علي أن أفعل لاسترداد هذه القيمة إلى قاموس الموارد؟ (أنا أعرف Binding
أو DynamicResource
لا يمكن تطبيقه. ولكن مهلا ، هذه قيمة ثابتة ، فكيف يمكنني التقديم StaticResource
أو x:Static
أو أيا كان؟)
لقد حاولت
<sys:Double x:Key="XXXFontSize">
<StaticResource ResourceKey="SystemFonts.MessageFontSize" />
</sys:Double>
و
<sys:Double x:Key="XXXFontSize">
<x:Static ResourceKey="SystemFonts.MessageFontSize" />
</sys:Double>
كلاهما لا يبدو أنه يعمل (كما هو متوقع). أحصل على خطأ في القول Cannot add content to object of type 'System.Double'.
ملحوظة:
- لا أريد القيام بذلك من الكود ، على سبيل المثال من التطبيق (). (هل من الممكن أن يكون لديك رمز behind للموارد؟)
لا أريد تغليف هذا بأسلوب معمم يمكن من خلاله اشتقاق الأنماط الأخرى (باستخدام
BasedOn
) لأن لدي العديد من قواميس الموارد ، ولن يكون من الممكن استخدامهاDynamicResource
معBasedOn
هذا هو ، لا يمكنني استخدام<Style x:Key="BigFont" TargetType="{x:Type Control}"}> <Setter Property="Control.FontSize" Value="{Binding Source={x:Static SystemFonts.MessageFontSize}, Converter={ . . . }" /> </Style>
لأنه ، إذا كان لدي أسلوب في موارد أخرى ، قل
HeaderTextBlockStyle
, ، ثم يجب أن أستخدمBasedOn={DynamicResource BigFont}
وهو أمر غير ممكن (على ما أظن)
أي مساعدة سيكون موضع تقدير كبير.
شكرًا لك.
العلامات : WPF SystemFonts.MessageFontsize ResourctiveTictionary Fontsize المستندة إلى DynamicResource
المحلول
لقد فعلت مثل هذا ...
public partial class GlobalResources : ResourceDictionary
{
public GlobalResources()
{
this.Add("GiantFontSize", SystemFonts.MessageFontSize * 2.5);
this.Add("BigFontSize", SystemFonts.MessageFontSize * 1.5);
this.Add("MediumFontSize", SystemFonts.MessageFontSize * 1.25);
this.Add("NormalFontSize", SystemFonts.MessageFontSize);
this.Add("SmallFontSize", SystemFonts.MessageFontSize * 0.85);
}
}
... وهو يعمل مثل معجزة !!! يمكنني استخدام هذه الموارد في نفس قاموس الموارد (الجزئي) أو من قواميس الموارد الأخرى مثل هذا ...
<Style ...>
<Setter Property="FontSize"
Value="{DynamicResource MediumFontSize}" />
...
</Style>
لا أعرف ما إذا كانت "ممارسة جيدة" أم لا (يرجى التعليق على هذا) ، وأنا أعلم فقط أنه يعمل .. !!!
نصائح أخرى
تحقق من هذه المقالة: تجاوز الأنماط الافتراضية قد يكون لديه ما تبحث عنه.