2009-07-26 11 views
11

चलें कहते हैं कि मैं नीचे है:Style.Triggers कैसे बनाने के लिए एक अलग नाम दिया शैली लागू करने के लिए गति प्रदान

<Style TargetType="{x:Type TextBox}"> 
    <Setter Property="BorderThickness" Value="1" /> 
    <Setter Property="BorderBrush" Value="Gray" /> 
    <Style.Triggers> 
     <Trigger Property="IsFocused" Value="true"> 
      <Setter Property="BorderBrush" Value="Green" /> 
      <Setter Property="BorderThickness" Value="2" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

यह ठीक काम करता है और यहाँ बहुत ज्यादा कुछ भी गलत नहीं है, लेकिन यह एक अत्यंत साधारण मामला है । अगर मैं एक exsplicit शैली कैसे उस शैली को संदर्भित IsFocused शैली होने के रूप में कर के रूप में सूचीबद्ध IsFocused शैली राज्य करना चाहते हैं तो क्या होता है, यानी

<Style x:key="ActiveStyle" TargetType="{x:Type TextBox}"> 
    <Setter Property="BorderBrush" Value="Green" /> 
    <Setter Property="BorderThickness" Value="2" /> 
</Style> 

<Style TargetType="{x:Type TextBox}"> 
    <Setter Property="BorderThickness" Value="1" /> 
    <Setter Property="BorderBrush" Value="Gray" /> 
    <Style.Triggers> 
     <Trigger Property="IsFocused" Value="true"> 
      -- Here I want to reference ActiveStyle and not copy the copy the setters 
     </Trigger> 
    </Style.Triggers> 
</Style> 

उत्तर

11

मुझे नहीं लगता कि आप फिर भी, आप एक शैली इस पुन: उपयोग कर सकते हैं कर सकते हैं तरीका:

<Style x:Key="ActiveStyle" TargetType="{x:Type TextBox}"> 
    <Style.Triggers> 
     <Trigger Property="IsFocused" Value="true"> 
      <Setter Property="BorderBrush" Value="Green" /> 
      <Setter Property="BorderThickness" Value="2" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource ActiveStyle}"> 
    <Setter Property="BorderThickness" Value="1" /> 
    <Setter Property="BorderBrush" Value="Gray" /> 
</Style> 

मैं एक और समाधान :(नहीं दिख रहा है

+0

आदर्श नहीं मैं मानता हूँ:

<ControlTemplate x:Key="NotFocused" TargetType="{x:Type TextBox}"> . . . </ControlTemplate> <ControlTemplate x:Key="Focused" TargetType="{x:Type TextBox}"> . . . </ControlTemplate> 

तो फिर तुम उस में चलाता साथ टेक्स्ट बॉक्स की एक डिफ़ॉल्ट शैली बनाने लेकिन धन्यवाद – vdhant

7

WPF इस FrameworkElement.FocusVisualStyle के लिए एक विशेष संपत्ति प्रदान कर रहा है तो आगे बढ़िए और कि :)

आवंटित

या किसी अन्य तरीके से उपयोग करते हुए setters

<Style TargetType="{x:Type TextBox}"> 
<Setter Property="BorderThickness" Value="1" /> 
<Setter Property="BorderBrush" Value="Gray" />  
<Setter Property="FocusVisualStyle" > 
    <Setter.Value> 
    <Style x:key="ActiveStyle" TargetType="{x:Type TextBox}"> 
     <Setter Property="BorderBrush" Value="Green" /> 
     <Setter Property="BorderThickness" Value="2" /> 
    </Style> 
    </Setter.Value> 
    </Setter> 
</Style> 
6

अभी तक यह करने के लिए एक तिहाई तरीका है।

अपने नियंत्रण के लिए दो नामित नियंत्रण टेम्पलेट्स बनाएँ:

<Style TargetType="{x:Type TextBox}"> 
    <Style.Triggers> 
     <Trigger Property="IsFocused" Value="True"> 
      <Setter Property="Template" Value="{StaticResource Focused}" /> 
     </Trigger> 
     <Trigger Property="IsFocused" Value="False"> 
      <Setter Property="Template" Value="{StaticResource NotFocused}" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

टोनी

+1

यह मेरे लिए अपवाद का कारण बनता है: "स्टाइल ऑब्जेक्ट को उस ऑब्जेक्ट की स्टाइल प्रॉपर्टी को प्रभावित करने की अनुमति नहीं है जिस पर यह लागू होता है।" यह एक तरह का है स्पष्ट, एक शैली खुद को किसी अन्य शैली में कैसे बदल सकती है लेकिन अभी भी काम करना जारी रखती है? – svick

+0

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

+0

@svick: मैंने अपना उदाहरण संपादित किया है, इसलिए अब यह काम करता है जो कोड का उपयोग करता है। यह अब मूल प्रश्न के लिए पूरी तरह से प्रासंगिक नहीं हो सकता है क्योंकि यह नियंत्रण टेम्पलेट्स और डिफ़ॉल्ट शैली का उपयोग करता है। लेकिन यह काम करता है। –

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