2009-05-21 15 views
51

मैं एक WPF ऐप बना रहा हूं और मैं ui में प्रत्येक तत्व के लिए फ़ॉन्ट आकार बदलने में सक्षम होने का सबसे अच्छा तरीका जानना चाहता हूं। क्या मैं संसाधन नियंत्रण शब्दकोश बनाता हूं और उपयोग किए गए सभी नियंत्रणों के लिए फ़ॉन्ट आकार सेट करने के लिए स्टाइल सेट करता हूं?डब्ल्यूपीएफ वैश्विक फ़ॉन्ट आकार

सबसे अच्छा अभ्यास क्या है?

उत्तर

69

मैं इसे ऐसा करने चाहते हैं रास्ता:

<Window.Resources> 
     <Style TargetType="{x:Type Control}" x:Key="baseStyle"> 
      <Setter Property="FontSize" Value="100" /> 
     </Style> 
     <Style TargetType="{x:Type Button}" BasedOn="{StaticResource baseStyle}"></Style> 
     <Style TargetType="{x:Type Label}" BasedOn="{StaticResource baseStyle}"></Style> 
     <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource baseStyle}"></Style> 
     <Style TargetType="{x:Type ListView}" BasedOn="{StaticResource baseStyle}"></Style> 
     <!-- ComboBox, RadioButton, CheckBox, etc... --> 
    </Window.Resources> 

इस तरह, अगर मैं सभी नियंत्रणों को बदलना चाहता हूं, तो मुझे बस "बेस स्टाइल" शैली बदलनी होगी, शेष बाकी से इसका उत्तराधिकारी होगा। (यही वह है जो संपत्ति के आधार पर है, यदि आप विरासत शैली के अंदर अन्य सेटर्स बनाते हैं तो आप बेस स्टाइल भी बढ़ा सकते हैं)

+3

और अगर आप मक्खी पर फ़ॉन्ट आकार बदलने की जरूरत है, यह सुनिश्चित करें कि उन सभी को DynamicResource करने की घोषणा की जाती है, दोनों शैलियों में और "baseStyle" करने के लिए शैली के संदर्भ में हैं। –

+0

Seroiouslly? मैंने ऐसा करने की कोशिश की और मुझे यह त्रुटि मिल गई: संपत्ति 'बेसऑन' प्रकार 'डायनामिक रिसोर्स एक्सटेंशन' प्रकार के मानों का समर्थन नहीं करती है। मैंने बस स्टेटिक रिसोर्स से डायनामिक रिसोर्स में कोड बदल दिया। आपको क्या लगता है गुम है? – Carlo

+0

उस छोटे से मुद्दे के बारे में भूल गए। हमारे पास हमारी सभी घोषणाएं हैं जो सेटर्स को प्रति-नियंत्रण घोषित करती हैं ताकि हमारे पास विशाल पदानुक्रम न हो। यह पोस्ट इसे बहुत अच्छी तरह से बताता है। http://stackoverflow.com/questions/585429/using-basedon-style-property-on-dynamicresources –

3

WPF में किसी भी शैली के लिए, आपके पास एक अलग संसाधन शब्दकोश होना चाहिए जिसमें आपके ऐप के लिए शैलियों हों।

यदि आप एक ही फ़ॉन्ट आकार चाहते हैं जो पूरे ऐप में पुन: उपयोग किया जाता है तो बस उस फ़ॉन्ट आकार के लिए एक शैली बनाएं। आप या तो इसे स्पष्ट रूप से उपयोग करने के लिए एक अद्वितीय नाम/कुंजी दे सकते हैं या आप एक लक्ष्य टाइप सेट कर सकते हैं जो पूरे ऐप से आगे बढ़ेगा।

स्पष्ट कुंजी:

<Style 
    x:Key="MyFontSize" 
    TargetType="TextBlock"> 
    <Setter 
     Property="FontSize" 
     Value="10" /> 
</Style> 

<Control 
    Style="{StaticResource MyFontSize}" /> 

* इस शैली नियंत्रण contentPresenters

ऐप की पूरी textblocks के लिए है के साथ इस्तेमाल किया जा सकता नोट:

<Style 
    TargetType="TextBlock"> 
    <Setter 
     Property="FontSize" 
     Value="10" /> 
</Style> 

<TextBlock 
     Text="This text will be size 10" /> 
35

फ़ॉन्टसाइजप्रोपर्टी को अभिभावक नियंत्रण से विरासत में मिला है। तो आपको बस अपनी मुख्य विंडो के फ़ॉन्ट आकार को बदलने की जरूरत है।

इस काम करना चाहिए आप गतिशील व्यवहार की जरूरत नहीं है:

अपने ResourceDictionary

<Style TargetType="{x:Type Window}"> 
    <Setter Property="FontSize" Value="15" /> 
</Style> 

को खिड़की के लिए एक शैली जोड़ें अपने मुख्य फार्म के लिए शैली लागू करें (क्योंकि निहित लागू नहीं किया जाएगा इसके एक व्युत्पन्न प्रकार)

Style = (Style)FindResource(typeof (Window)); 
+0

है समाधान के रूप में चिह्नित उत्तर से बेहतर अभ्यास की तरह लगता है। मैं इसके साथ जाऊंगा, किसी भी मामले में यह बहुत कम कोड है। –

+2

संपादित करें: काम नहीं करता है (किसी भी मामले में फ्रेमवर्क 4.5 के साथ)। –

+0

@ कोर्टेवनक्लेफ - यह मेरे लिए .NET 4.5 पर काम करता है, आप क्या समस्या देख रहे हैं? – joshcomley

1

आप प्रोग्राम वैश्विक fONTSIZE, स्थिर नहीं (XAML) को बदलने की जरूरत है, तो आपके सभी खिड़कियों के लिए एक बार लागू किया जाना है, तो आप कर सकते हैं:

TextElement.FontSizeProperty.OverrideMetadata(
      typeof(TextElement), 
      new FrameworkPropertyMetadata(16.0)); 

     TextBlock.FontSizeProperty.OverrideMetadata(
      typeof(TextBlock), 
      new FrameworkPropertyMetadata(16.0)); 

यह मान, किसी भी TextBlock, लेबल और किसी भी खिड़कियों में लगभग किसी भी पाठ पर लागू होते हैं, जबकि यह एक स्पष्ट FONTSIZE परिभाषित नहीं है। लेकिन यह टेक्स्टबॉक्स के लिए प्रभावित नहीं होता है, आपको इसके लिए या किसी अन्य विशेष नियंत्रण के लिए एक समान कोड लिखना होगा।

24

एक और विकल्प फ़ॉन्टफैमिली और फ़ॉन्टसाइज को संसाधनों के रूप में परिभाषित करना है।

<FontFamily x:Key="BaseFontFamily">Calibri</FontFamily> 
<sys:Double x:Key="BaseFontSize">12</sys:Double> 

इस तरह आप अपने setters में उन्हें इस्तेमाल कर सकते हैं।

+0

यह मेरे लिए सबसे अच्छा काम करता है क्योंकि यह आपको {DynamicResource} का उपयोग करने और रनटाइम पर फ़ॉन्ट आकार बदलने की अनुमति देता है। – Peter

+4

_xmlns आयात करना था: sys = "clr-namespace: system; assembly = mscorlib" _ और यह विधि सही काम करती है। – wchoward

8
Application.Current.MainWindow.FontSize = _appBodyFontSize; 

इस तरह आप भी रन टाइम पर फ़ॉन्ट का आकार बदल सकते हैं।

3

TextElement.FontSize एक इनहेरिट संपत्ति, तो आप बस मूल तत्व पर फ़ॉन्ट आकार सेट कर सकते हैं जिसका मतलब है कि है, और सभी बच्चों के तत्वों (जब तक आप उन्हें मैन्युअल परिवर्तन नहीं करते के रूप में) है कि आकार का उपयोग करेगा

+0

महत्वपूर्ण: "जब तक आप उन्हें मैन्युअल रूप से नहीं बदलते"। मुझे यह पता लगाने में कुछ समय लगा कि फ़ॉन्ट विरासत ने काम किया क्योंकि मैंने इसे माता-पिता के लिए मैन्युअल रूप से कहीं भी सेट किया था। –

12

<Window> है एक संपत्ति FontSize।

तो यदि आप उस विंडो के सभी तत्वों में फ़ॉन्ट्स को बदलना चाहते हैं तो आप वांछित फ़ॉन्ट्स को तत्व में सेट कर सकते हैं।

<Window FontSize="12"> 

</Window> 
संबंधित मुद्दे