2009-04-29 18 views
51

HTML/CSS में आप एक शैली जो तत्वों के कई प्रकार के लिए लागू किया जा सकता है, परिभाषित कर सकते हैं जैसे:क्या आप एक एक्सएएमएल शैली के लिए एकाधिक लक्ष्य प्रकार परिभाषित कर सकते हैं?

<p class="highlight">this will be highlighted</p> 
<div class="highlight">this will also be highlighted</div> 

लेकिन में:

.highlight { 
    color:red; 
} 

दोनों पी और DIV, जैसे करने के लिए लागू किया जा सकता

<Style x:Key="formRowLabel" TargetType="TextBlock"> 

वहाँ एक XAML शैली अनुमति देने के लिए एक तरह से एक से अधिक तत्वों या ई करने के लिए लागू किया जा रहा है: XAML आप अन्यथा आपको कोई त्रुटि मिलती शैलियों के लिए TargetType परिभाषित करने के लिए नहीं लगता है, सीएसएस में इसे खोलने के लिए वेन?

उत्तर

59

WPF शैलियों में setters संकलन समय के दौरान जाँच कर रहे हैं; सीएसएस शैलियों गतिशील रूप से लागू होते हैं।

आप इतना है कि WPF उस प्रकार के निर्भरता गुणों के setters में गुण हल कर सकते हैं एक प्रकार का उल्लेख किया है।

आप वर्गों है कि गुण आप चाहते हैं को शामिल आधार और फिर व्युत्पन्न वर्ग के लिए है कि शैली लागू करने के लिए लक्ष्य प्रकार सेट कर सकते हैं। उदाहरण के लिए, आप नियंत्रण वस्तुओं के लिए एक शैली बना सकते हैं और उसके बाद (आदि बटन, टेक्स्ट बॉक्स, चेकबॉक्स,) नियंत्रण के कई प्रकार के

<Style x:Key="Highlight" TargetType="{x:Type Control}"> 
    <Setter Property="Foreground" Value="Red"/> 
</Style> 

में इसे लागू ...

<Button Style="{StaticResource Highlight}" Content="Test"/> 
<TextBox Style="{StaticResource Highlight}" Text="Test"/> 
<CheckBox Style="{StaticResource Highlight}" Content="Test"/> 
+0

हाँ लेकिन क्या अगर आप बटन और बक्सें नहीं बल्कि स करने के लिए इसे लागू करना चाहते हैं? –

+1

आप इसे जो कुछ भी चाहते हैं उसे लागू कर सकते हैं। इस शैली को नियंत्रणों पर लागू किया जाना चाहिए। यदि आप 'x: key = "हाइलाइट" को हटाते हैं तो केवल सभी नियंत्रणों पर लागू किया जाएगा। यदि आप नहीं चाहते हैं कि यह चेकबॉक्स पर लागू हो, तो 'Style =' प्रॉपर्टी छोड़ दें। –

+3

स्पष्टीकरण: स्टाइल परिभाषा से 'x: key = "हाइलाइट करें" को उस प्रकार के सभी उदाहरणों पर स्टाइल लागू करने के लिए निकालें। कुंजी के साथ, उस नियंत्रण से स्टाइल को हटाने के लिए नियंत्रण से 'शैली = "{स्टेटिक रिसोर्स हाइलाइट}" को हटा दें। –

-2

मैं इस काम के मिला

<Style x:Key="HeaderStyleThin" TargetType="{x:Type Border}"> 
    <Setter Property="Background" Value="Black" /> 

    <Style.Resources> 
     <Style TargetType="{x:Type TextBlock}"> 
       <Setter Property="Background=" Value="Red" /> 
     </Style> 
     </Style.Resources> 

</Style> 
3

प्रश्न का एक वैकल्पिक उत्तर है। आप स्टाइल से लक्ष्य टाइप टाइप पैरामीटर को पूरी तरह से छोड़ सकते हैं जो इसे विभिन्न विभिन्न नियंत्रणों पर लागू करने की अनुमति देगा, लेकिन केवल तभी जब आप "नियंत्रण" के साथ संपत्ति का नाम उपसर्ग करते हैं।

<Style x:Key="Highlight"> 
    <Setter Property="Control.Foreground" Value="Red"/> 
</Style> 

जाहिर है, आधार नियंत्रण वर्ग के गुणों के लिए यह केवल काम करता है। आप ItemsSource कहना सेट करने की कोशिश की है, यह विफल हो जाएगा कोई Control.ItemsSource

+1

ऐसा करने से आप निहित रूप से लक्ष्य टाइप का संकेत दे रहे हैं; और जैसा कि आप कहते हैं कि यह केवल तभी काम करता है जब इसे लागू किया गया तत्व एक नियंत्रण है। इसलिए, यह लक्ष्य टाइप टाइप को नियंत्रण में छोड़ने के अलावा कुछ भी नहीं प्रदान करता है। –

29
<!-- Header text style --> 
<Style x:Key="headerTextStyle"> 
    <Setter Property="Label.VerticalAlignment" Value="Center"></Setter> 
    <Setter Property="Label.FontFamily" Value="Trebuchet MS"></Setter> 
    <Setter Property="Label.FontWeight" Value="Bold"></Setter> 
    <Setter Property="Label.FontSize" Value="18"></Setter> 
    <Setter Property="Label.Foreground" Value="#0066cc"></Setter> 
</Style> 

<!-- Label style --> 
<Style x:Key="labelStyle" TargetType="{x:Type Label}"> 
    <Setter Property="VerticalAlignment" Value="Top" /> 
    <Setter Property="HorizontalAlignment" Value="Left" /> 
    <Setter Property="FontWeight" Value="Bold" /> 
    <Setter Property="Margin" Value="0,0,0,5" /> 
</Style> 

है क्योंकि मैं एक शैली अपना उत्तर मिल सकता घोषित करने के इन तरीकों में से दोनों में सोचते हैं। पहले में, कोई लक्ष्य टाइप निर्दिष्ट नहीं है, लेकिन संपत्ति के नाम 'लेबल' के साथ उपसर्ग किए गए हैं। दूसरे में, शैली लेबल ऑब्जेक्ट्स के लिए बनाई गई है।

यह करने के लिए एक और तरीका है:

<UserControl.Resources> 
    <Style x:Key="commonStyle" TargetType="Control"> 
    <Setter Property="FontSize" Value="24"/> 
    </Style> 
    <Style BasedOn="{StaticResource commonStyle}" TargetType="ListBox"/> 
    <Style BasedOn="{StaticResource commonStyle}" TargetType="ComboBox"/> 
</UserControl.Resources> 
+0

हेडर टेक्स्टक्स्टाइल अभी भी केवल उस लेबल और कक्षाओं पर लागू हो सकता है जो इससे प्राप्त होता है, इसलिए आपको लक्ष्य टाइप टाइप छोड़ने से कुछ भी नहीं मिलता है। –

+0

@Steve: मुझे लगता है कि यह आपके संदेह का उत्तर दे सकता है। पहले उदाहरण के लिए – Gaurang

+0

, आप 'UIElement' के साथ' लेबल 'को प्रतिस्थापित कर सकते हैं ताकि यह आम तौर पर कई प्रकार के नियंत्रणों में काम कर सके – Julien

2

मैं एक TextBlock और किसी पाठ बॉक्स लेकिन चयनित जवाब मेरे लिए काम नहीं किया क्योंकि TextBlock नियंत्रण से विरासत नहीं है, में से कोई शैली लागू करना चाहते थे मेरे मामले मैं दृश्यता संपत्ति को प्रभावित करना चाहता था, इसलिए मैं FrameworkElement

<Style x:Key="ShowIfRequiredStyle" TargetType="{x:Type FrameworkElement}"> 
     <Setter Property="Visibility" Value="Collapsed"/> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding ShowIfRequiredStyle, UpdateSourceTrigger=PropertyChanged}" Value="true"> 
       <Setter Property="Visibility" Value="Visible"/> 
      </DataTrigger> 
     </Style.Triggers> 
</Style> 

<TextBlock Style="{StaticResource ResourceKey=ShowIfRequiredStyle}"/> 
<TextBox Style="{StaticResource ResourceKey=ShowIfRequiredStyle}"/> 

इस्तेमाल किया यह दृश्यता संपत्ति के लिए काम करता है, क्योंकि दोनों आइटम Frameworkelement से विरासत और संपत्ति वहाँ परिभाषित किया गया है। बेशक यह केवल नियंत्रण में परिभाषित गुणों के लिए काम नहीं करेगा, आप पदानुक्रम के पेड़ की खोज कर सकते हैं और बेस क्लास को खोजने का प्रयास कर सकते हैं, वैसे भी मैंने सोचा कि यह किसी की मदद कर सकता है क्योंकि यह एक शीर्ष खोज परिणाम है और चयनित उत्तर थोड़ा अपूर्ण है।

+1

हाँ लक्ष्य प्रकार = "{x: प्रकार फ्रेमवर्क एलिमेंट}" मेरे लिए काम नहीं किया 'नियंत्रण' –

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

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