(WPF) كيفية تعيين قيمة sys: double to systemfonts.messagefontsize من الموارد؟

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

سؤال

سيناريو:

أرغب في استخدام 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>

لا أعرف ما إذا كانت "ممارسة جيدة" أم لا (يرجى التعليق على هذا) ، وأنا أعلم فقط أنه يعمل .. !!!

نصائح أخرى

تحقق من هذه المقالة: تجاوز الأنماط الافتراضية قد يكون لديه ما تبحث عنه.

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