2012-06-12 15 views
5

मैं डब्ल्यूपीएफ में 0 से इसकी वास्तविक चौड़ाई तक किसी तत्व की चौड़ाई को कैसे एनिमेट कर सकता हूं?डब्ल्यूपीएफ में वास्तविक चौड़ाई के लिए एनिमेशन चौड़ाई?

<ControlTemplate.Triggers> 
    <EventTrigger RoutedEvent="Loaded"> 
     <BeginStoryboard> 
      <Storyboard> 
       <DoubleAnimation Duration="0:0:0.3" To="{Binding ElementName=MyElement, Path=ActualWidth}" From="0" Storyboard.TargetProperty="Width" Storyboard.TargetName="MyElement" /> 
      </Storyboard> 
     </BeginStoryboard> 
    </EventTrigger> 
</ControlTemplate.Triggers> 

अगर मैं बदल एक कठिन कोडित मूल्य के लिए बाध्य, 100 की तरह है, तो चौड़ाई ठीक से, एनिमेटेड है, सिवाय इसके कि मैं तत्व की वास्तविक चौड़ाई के लिए बाध्य करना चाहते हैं:

मैं इस कोशिश की।

यदि यह महत्वपूर्ण है, MyElement एक सीमा है, और मैं एक टैब आइटम एनिमेट कर रहा हूं।

रिकॉर्ड के लिए, यह काम नहीं करता है या तो:

To="{Binding RelativeSource={RelativeSource AncestorType={x:Type Border}}, Path=ActualWidth}" 

उत्तर

9

मुझे यकीन है कि यह कई कारणों से गलत है और कृपया मुझे बताने में संकोच न करें कि मैंने कितने डब्ल्यूपीएफ कानूनों का उल्लंघन किया है लेकिन .. मैंने अपनी खुद की बाइंडेबल डबल एनीमेशन बनाकर एक ही समस्या हल की है।

public class BindableDoubleAnimation : DoubleAnimationBase 
{ 
    DoubleAnimation internalAnimation; 

    public DoubleAnimation InternalAnimation { get { return internalAnimation; } } 

    public double To 
    { 
     get { return (double)GetValue(ToProperty); } 
     set { SetValue(ToProperty, value); } 
    } 

    /// <summary> 
    /// Dependency backing property for the <see cref="To"/> property. 
    /// </summary> 
    public static readonly DependencyProperty ToProperty = 
     DependencyProperty.Register("To", typeof(double), typeof(BindableDoubleAnimation), new UIPropertyMetadata(0d, new PropertyChangedCallback((s, e) => 
      { 
       BindableDoubleAnimation sender = (BindableDoubleAnimation)s; 
       sender.internalAnimation.To = (double)e.NewValue; 
      }))); 


    public double From 
    { 
     get { return (double)GetValue(FromProperty); } 
     set { SetValue(FromProperty, value); } 
    } 

    /// <summary> 
    /// Dependency backing property for the <see cref="From"/> property. 
    /// </summary> 
    public static readonly DependencyProperty FromProperty = 
     DependencyProperty.Register("From", typeof(double), typeof(BindableDoubleAnimation), new UIPropertyMetadata(0d, new PropertyChangedCallback((s, e) => 
     { 
      BindableDoubleAnimation sender = (BindableDoubleAnimation)s; 
      sender.internalAnimation.From = (double)e.NewValue; 
     }))); 


    public BindableDoubleAnimation() 
    { 
     internalAnimation = new DoubleAnimation(); 
    } 

    protected override double GetCurrentValueCore(double defaultOriginValue, double defaultDestinationValue, AnimationClock animationClock) 
    { 
     return internalAnimation.GetCurrentValue(defaultOriginValue, defaultDestinationValue, animationClock); 
    } 

    protected override Freezable CreateInstanceCore() 
    { 
     return internalAnimation.Clone();; 
    } 
} 

अब मैं गुणों से गुणों के लिए बाइंडिंग का उपयोग करने के लिए स्वतंत्र हूं।

<local:BindableDoubleAnimation Storyboard.TargetProperty="Width" From="0" To="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType=Window}}"/> 
+0

क्या किसी ने इसे 'BindableDoubleAnimation 'के लिए काम करने के लिए प्राप्त किया है जो' स्टोरीबोर्ड 'के अंदर है जो' ControlTemplate' के' विजुअलस्टेट 'में है? उन मामलों के लिए जहां मेरे पास 'विजुअलस्टेट' में केवल एक 'बाइंडेबल डबल एनीमेशन' है और मैं "टू" वैल्यू ("100" जैसा कुछ कहने के लिए) को हार्डकोड करता हूं, कुछ भी एनिमेटेड नहीं होता है, और न तो 'GetCurrentValueCore' और न ही 'CreateInstanceCore' को कॉल किया जा रहा है) । उन मामलों के लिए जहां मैं "टू" संपत्ति पर बाध्यकारी डेटा का उपयोग करता हूं, बाध्यकारी हमेशा विफल रहता है, हमेशा त्रुटि को आउटपुट करता है "बाध्यकारी के लिए स्रोत नहीं ढूंढ सकता ..."। यहां तक ​​कि जब मैं ऊपर verbatim से सबकुछ कोशिश करता हूं, यह विफल रहता है। –

+0

... मुझे यह काम करने के लिए मिलना अच्छा लगेगा - ऐसा लगता है जैसे यह एक अच्छा समाधान हो सकता है! –

2

बाइंडिंग एनिमेशन में इस्तेमाल नहीं किया जा सकता है कि जा रहा है एक आम समस्या।

एक वैकल्पिक हल होगा कि आप एक सहायक ऑब्जेक्ट जो SourceValue & TargetValue है (जो आप जो कुछ भी आप चाहते हैं करने के लिए बाध्य कर सकते हैं ActualWidth सहित) का उपयोग एक CurrentValue (जो एनिमेटेड मान देता है) और एक Progress जो 0.0 से एनिमेटेड किया जा सकता 100.0 तक जब प्रगति बदल जाती है तो आपको CurrentValue की गणना करने की आवश्यकता होती है, जिसके बाद आप अपनी ऑब्जेक्ट के Width को बाध्य कर सकते हैं। यह सुंदर नहीं है लेकिन काम करना चाहिए।

+0

मैं इस उत्तर पर स्पष्ट नहीं हूं। क्या आप एक कोड नमूना प्रदान कर सकते हैं? क्या आप @ एंडी के समाधान के समान कुछ वर्णन कर रहे हैं? –

+0

@PhillipScottGivens: एंडी का जवाब हमेशा इसके ऊपर एक बाध्यकारी परत बनाकर एनीमेशन को संशोधित करता है। मैं जो सुझाव देता हूं वह अलग है, मैं एक मध्यस्थ वस्तु का सुझाव देता हूं जो हमेशा उसी एनीमेशन का उपयोग करता है जो '0' से '100' तक (' एनीमेशन नहीं बदलता) से अपनी 'प्रगति' संपत्ति को एनिमेट करता है), यह ऑब्जेक्ट एनीमेशन मान को' CurrentValue' प्रॉपर्टी जो उसके 'SourceValue',' TargetValue' और 'प्रोग्रेस' से गणना की गई मान देता है। –

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