2011-03-03 12 views
14

मान लीजिए कि मैं 4 बॉर्डर्स के साथ एक UserControl करते हैं:डब्ल्यूपीएफ: सीएसएस में कक्षा की तरह शैली कैसे बनाएं?

<Border /> 
<Border /> 
<Border /> 
<Border /> 

अब मेरी संसाधन में मैं जा सकते हैं:

<Style TargetType="{x:Type Border}"> 
    ... change some properties here 
</Style> 

अब इस सब अच्छा है, लेकिन यह मेरी UserControl में सभी सीमाओं को लक्षित करेंगे। लेकिन अगर मैं सिर्फ उनके उप-समूह को लक्षित करना चाहता हूं तो क्या होगा?

<Border Class="Type1" /> 
<Border Class="Type1" /> 
<Border /> 
<Border /> 

और फिर जाना:

मैं जाना चाहता

<Style TargetType="{x:Type Border}" TargetClass="Type1"> 
    ... change some properties here 
</Style> 

लेकिन यह स्पष्ट रूप से मौजूद नहीं है, वहाँ है कि मैं क्या कर रहा हूँ के बाद किसी अन्य तरह से मैं प्राप्त कर सकते हैं ? धन्यवाद

उत्तर

1

आप सीमा के एक्स: कुंजी और स्टेटिक रिसोर्स (या डायनामिक रिसोर्स) संपत्ति का उपयोग कर सीधे शैली को <Border> पर सेट कर सकते हैं। यदि आप रनटाइम पर शैली को बदलना चाहते हैं, तो आपको StaticResource पर डायनामिक रिसोर्स का उपयोग करने की ओर झुकना चाहिए।

<Style x:Key="something" TargetType="{x:Type Border}"> 
</Style> 

<Border style="{StaticResource something}"/> 
13

हालांकि वाक्यविन्यास सीएसएस में जितना साफ नहीं है, यह बहुत अधिक विशिष्ट है।

अपने उदाहरण पर निर्माण करने के लिए, क्या आप के लिए देख रहे हैं:

<Border Style="{StaticResource Type1}" /> 
<Border Style="{StaticResource Type1}" /> 
<Border /> 
<Border /> 

और फिर जाना:

<Style TargetType="{x:Type Border}" x:Key="Type1"> 
    ... change some properties here 
</Style> 

याद रखें कि WPF शैलियों वास्तव में झरना नहीं है सीएसएस करता है।

एक अधिक विस्तृत स्टाइल संदर्भ: http://dotnetslackers.com/articles/wpf/StylesResourcesAndControlTemplatesInWPF.aspx

2
<Style x:Key="styleKey" TargetType="{x:Type Border}"> 
    ... change some properties here 
</Style> 

और

<Border Style="{StaticResource styleKey}" 
9

कोई चीज जो मुझे लगता है कि ज्यादातर लोगों को जानकारी नहीं है WPF के Style.Resources भीतर घोंसला शैलियाँ की क्षमता है। उदाहरण के लिए:

<!-- Define a new style for Borders called InfoBox, that will have a red background, 
    and further override all buttons within it to have Yellow Text. An extra style, 
    "Strawberry" is also defined, that lets specific buttons be selected to be styled 
    as Green FG on DarkRed BG --> 
<Style TargetType="{x:Type Border}" x:Key="InfoBox"> 
    <Setter Property="Background" Value="Red"/> 
    <Style.Resources> 
    <Style TargetType="{x:Type Button}"> 
     <Setter Property="Foreground" Value="DarkYellow"/> 
    </Style> 
    <Style TargetType="{x:Type Button}" x:Key="Strawberry"> 
     <Setter Property="Foreground" Value="Green"/> 
     <Setter Property="Background" Value="DarkRed"/> 
    </Style> 
    </Style.Resources> 
</Style> 

... 

<Border Style="{DynamicResource InfoBox}"> 
    <StackPanel> 
    <Button Content="I am a banana!"/> 
    <Button Style="{DynamicResource Strawberry}" Content="I am red!"/> 
    </StackPanel> 
</Border> 

जबकि नहीं बिल्कुल एक ही सीएसएस के रूप में (वहाँ मानक छद्म चयनकर्ताओं के लिए ज्यादा समर्थन नहीं है), यह आप की शक्ति और विकल्प की एक बड़ी राशि देता है। आइटम्स कंट्रोल्स के कुशल उपयोग के साथ इसे जोड़ो और आप कुछ महान चीजें कर सकते हैं।

+0

'शैली। स्रोत' शब्दकोश में डिफ़ॉल्ट शैली पार्स में दिखाई नहीं देती है। – codekaizen

+0

डब्ल्यूपीएफ में, ऐसा लगता है कि यह वीएस डिजाइनर में काम करता है, लेकिन यह चेतावनी देता है "संसाधन" स्ट्रॉबेरी "को हल नहीं किया जा सका।" एक बार जब मैं स्ट्रॉबेरी को घोंसला करता हूं तो चेतावनी खत्म हो जाती है। यद्यपि गतिशील संसाधन का उपयोग करना चाहिए। स्टेटिक संसाधन अनसुलझा त्रुटि फेंक देगा। –

संबंधित मुद्दे