2011-01-02 17 views
5

संपादित करें:मूल प्रश्न में मैंने सेटर्स कैसे काम करते हैं, इस बारे में कुछ गलत धारणाएं की हैं इसलिए मैंने इसे अधिक सटीक और उपयोगी होने के लिए संशोधित किया।क्या संपत्तियों के गुणों के लिए स्टाइल सेटर का उपयोग करने का कोई तरीका है?

यदि माउस आइटम पर नहीं है तो आइकन आधे पारदर्शी दिखाई देकर कुछ मेनू आइटम को और अधिक रोचक बनाने का प्रयास किया है। यदि माउस प्रवेश करता है, तो आइकन पूरी तरह से दिखाई देने के लिए एनिमेटेड होना चाहिए। एनिमेशन काम करते हैं, Storyboard.TargetProperty आइकन की अस्पष्टता संपत्ति के लिए सीधी पहुँच की अनुमति देता है:

<Style x:Key="MenuItemMouseOverStyle" TargetType="MenuItem"> 
    <Style.Triggers> 
     <EventTrigger RoutedEvent="MouseEnter"> 
      <BeginStoryboard> 
       <Storyboard> 
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Icon.Opacity"> 
         <EasingDoubleKeyFrame KeyTime="0" Value="0.5"/> 
         <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="1"/> 
        </DoubleAnimationUsingKeyFrames> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
     <EventTrigger RoutedEvent="MouseLeave"> 
      <BeginStoryboard> 
       <Storyboard> 
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Icon.Opacity"> 
         <EasingDoubleKeyFrame KeyTime="0" Value="1"/> 
         <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="0.5"/> 
        </DoubleAnimationUsingKeyFrames> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
    </Style.Triggers> 
</Style> 

तो मैं प्रारंभिक आइकन-अस्पष्टता के लिए एक सेटर इस्तेमाल करने की कोशिश कोड संकलन नहीं होगा:

<Setter Property="Icon.Opacity" Value="0.5"/> 

संपादित करें: Setters तरह से मैं उन्हें उपयोग करने के लिए, आप गुण के गुणों (उत्तर देखें) उपयोग नहीं कर सकते करने की कोशिश की काम नहीं करते केवल एक चीज आप कर सकते हैं एक लक्ष्य वर्ग निर्दिष्ट है अगर शैली का लक्ष्य प्रकार सेट नहीं किया गया है, तो निम्न शैलियों बराबर होना चाहिए:

<Style x:Key="Style1" TargetType="Image"> 
    <Setter Property="Opacity" Value="0.5"/> 
</Style> 
<Style x:Key="Style2"> 
    <Setter Property="Image.Opacity" Value="0.5"/> 
</Style> 

तो मेरे सवाल है, अगर वहाँ के लिए एक रास्ता है किसी भी तरह से एक सेटटर के साथ काम करते हैं।

उत्तर

1

मुझे नहीं लगता कि आप कि इतने कास्टिंग की तरह एक संपत्ति के एक संपत्ति का उपयोग कर सकते हैं (मेरे वर्तमान काम के आसपास एक एकल-फ़्रेम स्टोरीबोर्ड कि Loaded घटना है जो काफी अच्छी तरह से काम करता है के साथ शुरू हो रहा है है) खुद समस्या नहीं है। यहां तक ​​कि अगर आइकन टाइप छवि का था जो अभी भी काम नहीं करेगा। उदाहरण के लिए आप ग्रिड के लिए पृष्ठभूमि की अस्पष्टता के साथ प्रयास कर सकते हैं। पृष्ठभूमि ग्रिड के लिए एक निर्भरता संपत्ति है और अस्पष्टता ब्रश के लिए एक निर्भरता संपत्ति है, लेकिन निम्नलिखित लाइन काम नहीं करेगा

<Grid Background.Opacity="0.8"/> 

आप

कुर्की संपत्ति 'अस्पष्टता' कह एक त्रुटि मिल जाएगा था टाइप 'पृष्ठभूमि' में नहीं मिला।

आप इस

<Grid> 
    <Grid.Background> 
     <SolidColorBrush Opacity="0.8"/> 
    </Grid.Background> 
</Grid> 

तो क्या इस के रूप में जब आप इस

<Grid TextBlock.Foreground="Red"> 
    <TextBlock Text="Test"/> 
</Grid> 

की तरह कुछ आप वास्तव में संलग्न का उपयोग कर रहे करना का मतलब है की तरह ही पृष्ठभूमि में इस सेट करने के लिए होगा टेक्स्टब्लॉक के लिए संपत्ति अग्रभूमि।

छवि एक संलग्न संपत्ति कहा जाता अस्पष्टता ताकि आप ऐसा नहीं कर सकते नहीं है या तो

<MenuItem Image.Opacity="0.8" /> 

एक आप पहले से ही कर रहे हैं के अलावा एक अन्य वैकल्पिक हल इस (सर्वोच्च MenuItem की तरह कुछ का उपयोग करने के लिए है या जहां भी आप इसका उपयोग करना चाहते हैं)।

<MenuItem x:Name="topMenuItem" 
      ...> 
    <MenuItem.Resources> 
     <Style TargetType="Image"> 
      <Setter Property="Opacity" Value="0.5"/> 
     </Style> 
    </MenuItem.Resources> 
    <!-- ... --> 
</MenuItem> 
+0

आपका प्रस्तावित समाधान काम करता है लेकिन एकल कीफ्रेम वर्कअराउंड की तुलना में दर्द का और भी अधिक है क्योंकि सेटर को समान शैली परिभाषा में होना चाहिए क्योंकि यह एनिमेशन से संबंधित है। खैर, मुझे किसी भी अच्छे समाधान की उम्मीद नहीं थी क्योंकि पूरे सेटर और ट्रिगर व्यवसाय थोड़ा सीमित है (उदाहरण के लिए EventTriggers केवल स्टोरीबोर्ड के साथ काम करते हैं और सरल सेटर्स नहीं) वैसे भी धन्यवाद। –

+0

@ एचबी: हाँ मैं मानता हूं, जिस समाधान का आप पहले से उपयोग कर रहे हैं वह बेहतर है इसलिए बस इसका उपयोग जारी रखें :) यदि संसाधन एक डीपी था तो आप इसे अपने मेनूइटम शैली में जोड़ सकते थे, लेकिन ऐसा नहीं है कि यह –

+0

नहीं है काफी समझते हैं कि आपका क्या मतलब है, संसाधनों को डीपी क्यों होना चाहिए? शैली में छवि शैली को एम्बेड करना। स्रोत काम करता है ... –

1

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

<Style x:Key="MenuItemMouseOverStyle" TargetType="MenuItem"> 
    <Style.Resources> 
     <Style TargetType="Image"> 
      <Setter Property="Opacity" Value="0.5"/> 
     </Style> 
    </Style.Resources> 
    <Style.Triggers> 
     <EventTrigger RoutedEvent="MouseEnter"> 
      <BeginStoryboard> 
       <Storyboard> 
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Icon.Opacity"> 
         <EasingDoubleKeyFrame KeyTime="0" Value="0.5"/> 
         <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="1"/> 
        </DoubleAnimationUsingKeyFrames> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
     <EventTrigger RoutedEvent="MouseLeave"> 
      <BeginStoryboard> 
       <Storyboard> 
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Icon.Opacity"> 
         <EasingDoubleKeyFrame KeyTime="0" Value="1"/> 
         <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="0.5"/> 
        </DoubleAnimationUsingKeyFrames> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
    </Style.Triggers> 
</Style> 

इस के साथ ही समस्या यह है कि यह वास्तव में Icon.Opacity लेकिन अस्पष्टता निर्धारित नहीं करता है MenuItem के भीतर होने वाली सभी छवियों में से।

+0

+1। शैली में स्रोत :) –

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

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