2011-04-15 8 views
11

मेरे पास एक थीम है जो संसाधन शब्दकोश में सभी बटनों पर लागू होती है। अब मैं शब्दकोश से स्टाइल बदलावों को विरासत में रखते हुए बटन पर एक ट्रिगर जोड़ना चाहता हूं। मैंने निम्नलिखित कोड का प्रयास किया:संसाधन शब्दकोश में किसी अन्य शैली पर एक शैली का आधार

लेकिन यह कहता है कि नियंत्रण नहीं मिला। मैं इसे कैसे ठीक कर सकता हूं?

<UserControl.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="Theme.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 

     <conv:ErrorContentConverter x:Key="ErrorContentConverter" /> 

     <Style x:Key="ValidTrigger" 
      TargetType="Control" BasedOn="{StaticResource {x:Type Control}}" > 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Path=IsValid}" Value="False"> 
       <Setter Property="IsEnabled" Value="false" /> 
      </DataTrigger> 
     </Style.Triggers> 
     </Style> 
    </ResourceDictionary> 
</UserControl.Resources> 

और आधार टेम्पलेट:

<Style TargetType="{x:Type Button}" BasedOn="{x:Null}"> 
    <Setter Property="FocusVisualStyle" 
      Value="{DynamicResource NuclearButtonFocusVisual}" /> 
    <Setter Property="Foreground" Value="#FF042271" /> 
    <Setter Property="FontFamily" Value="Trebuchet MS" /> 
    <Setter Property="FontSize" Value="12" /> 
    <Setter Property="Padding" Value="3" /> 

    <Setter Property="Template" Value="{DynamicResource ButtonTemplate}" /> 
</Style> 

उत्तर

12

अपने आधार शैली को कोई नाम दें, FooStyle का कहना है।

उदाहरण आपके द्वारा दिया गया है, को संशोधित TargetType और basedon इस प्रकार देखने के लिए:

<Style x:Key="ValidTrigger" 
     TargetType="{x:Type Control}" BasedOn="{StaticResource {x:Type Control}}" > 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Path=IsValid}" Value="False"> 
      <Setter Property="IsEnabled" Value="false" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 
+0

क्या मैं इसे नाम निर्दिष्ट किए बिना कर सकता हूं? शब्दकोश में नियंत्रण के लिए केवल एक शैली है। – Marcom

+0

क्या आपका मतलब है कि, आधार शैली की कुंजी असाइन करने के बजाय, आप विस्तारित शैली को यह पता लगाने के लिए चाहते हैं कि किस शैली को इसके लक्ष्य प्रकार के आधार पर विस्तारित किया जाए? मुझे नहीं पता। –

+0

आप मूल शैली को x: कुंजी = "FooStyle" देने में क्यों संकोच करते हैं? –

0

StaticResource vs DynamicResource

आप DynamicResource StaticResource के बजाय का उपयोग करना चाहते। आपका एप्लिकेशन संकलित होगा और संसाधन संकलन के बजाए रनटाइम पर हल हो जाएगा। ऐसा लगता था कि पुराने डब्ल्यूपीएफ दिनों में डायनेमिक रिसोर्स की प्रदर्शन लागत अधिक होगी, लेकिन अब यह एक गैर-मुद्दा प्रतीत होता है। मेरा मतलब है, हेक, अभिव्यक्ति मिश्रण WPF में लिखा गया है और पूरे डायनामिक संसाधनों का उपयोग करता है।


पीएस ध्यान रखें कि यदि आप वास्तव में संसाधन नाम को परिभाषित नहीं करते हैं, तो आपका ऐप अभी भी चल जाएगा, लेकिन आपके मामले में आप कार्यक्षमता खो देंगे। :)

+0

ऐसा लगता है कि यह नहीं किया जा सकता है, मैंने कोशिश की लेकिन मुझे पता चला कि डायनामिक रिसोर्स केवल निर्भरता गुणों के साथ उपयोग किया जा सकता है। – Zmaster

1

मुझे लगता है कि "नियंत्रण" के लिए परिभाषित कोई आधार शैली नहीं है, इसलिए आपके BasedOn="{StaticResource {x:Type Control}}" भाग को कुछ भी नहीं मिलेगा।

आप शायद बदलना चाहते

<Style x:Key="ValidTrigger" TargetType="Control" BasedOn="{StaticResource {x:Type Control}}" > 

को
<Style x:Key="ValidTrigger" TargetType="Button" BasedOn="{StaticResource {x:Type Button}}" > 
10

एक चाल मैंने पहले भी उपयोग किया है: अपने ResourceDictionary कि आपके आवेदन के लिए कंबल शैलियों को परिभाषित करता है में, के लिए एक x:Key जोड़ने जिस शैली से आप प्राप्त करना चाहते हैं, जैसे:

<Style TargetType="{x:Type Button}" x:Key="ButtonStyle"> 
    <!-- your style here --> 
</Style> 

वें लागू करने के लिए निर्दिष्ट प्रकार (इस उदाहरण में Button) के सभी नियंत्रण के लिए शैली स्पष्ट रूप से हर Button की Style विशेषता निर्धारित करने, एक और शैली है कि BasedOn इस शैली है जोड़ने के बिना है, लेकिन एक कुंजी नहीं है:

<Style TargetType="{x:Type Button}" BasedOn="{StaticResource ButtonStyle}" /> 

इस विधि का उपयोग करके, आपके आवेदन में सभी Button एस स्वचालित रूप से आपकी कस्टम शैली का उत्तराधिकारी होंगे, लेकिन आप अभी भी अतिरिक्त शैलियों BasedOnButtonStyle प्रविष्टि बना सकते हैं और अपनी सभी कस्टम स्टाइल को दूर करने से बच सकते हैं।