2009-07-06 14 views
9

मैं एक ऐसे प्रोजेक्ट पर काम कर रहा हूं जिसमें दो ऑब्जेक्ट्स के बीच घुमावदार पथ शामिल हैं। वर्तमान में, मैं बेजियर वक्र और एनीमेशन के साथ खेलने के लिए कुछ टेस्ट कोड लिख रहा हूं। पहला परीक्षण सीधे ऑब्जेक्ट (प्वाइंट 3) को ऑब्जेक्ट ऑब्जेक्ट (आयत) से गंतव्य ऑब्जेक्ट (एक अन्य आयताकार) तक सीधे सीधी रेखा में ले जाने के लिए है। यहां कोड है जो वास्तविक रेखा सेट करता है:डब्ल्यूपीएफ एनीमेशन - एनिमेटिंग बेजियर वक्र पॉइंट

 connector = new Path(); 
     connector.Stroke = Brushes.Red; 
     connector.StrokeThickness = 3; 

     PathGeometry connectorGeometry = new PathGeometry(); 
     PathFigure connectorPoints = new PathFigure(); 
     connectorCurve = new BezierSegment(); 

     connectorPoints.StartPoint = new Point((double)_rect1.GetValue(Canvas.LeftProperty) + _rect1.Width/2, 
      (double)_rect1.GetValue(Canvas.TopProperty) + _rect1.Height/2); 
     connectorCurve.Point1 = connectorPoints.StartPoint; 
     connectorCurve.Point2 = connectorPoints.StartPoint; 
     connectorCurve.Point3 = connectorPoints.StartPoint; 

     connectorPoints.Segments.Add(connectorCurve); 
     connectorGeometry.Figures.Add(connectorPoints); 
     connector.Data = connectorGeometry; 
     MainCanvas.Children.Add(connector); 

ठीक है, तो अब हमारे पास एक बिंदु पर एक रेखा गिर गई है। अब, देता है कि लाइन चेतन, (अंतिम बिंदुओं पर दो वस्तुओं) _rect2 को _rect1 से जा रहा: खूबसूरती से

 PointAnimation pointAnim = new PointAnimation(); 
     pointAnim.From = connectorCurve.Point3; 
     pointAnim.To = new Point((double)_rect2.GetValue(Canvas.LeftProperty) + _rect2.Width/2, 
      (double)_rect2.GetValue(Canvas.TopProperty) + _rect2.Height/2); 
     pointAnim.Duration = new Duration(TimeSpan.FromSeconds(5)); 
     board.Children.Add(pointAnim); 

काम करता है। हालांकि, जब मैं इसे स्टोरीबोर्ड से करने की कोशिश करता हूं, तो मुझे कुछ भी नहीं मिलता है। यहां स्टोरीबोर्ड कोड है:

 Storyboard board = new Storyboard(); 
     PointAnimation pointAnim = new PointAnimation(); 
     pointAnim.From = connectorCurve.Point3; 
     pointAnim.To = new Point((double)_rect2.GetValue(Canvas.LeftProperty) + _rect2.Width/2, 
      (double)_rect2.GetValue(Canvas.TopProperty) + _rect2.Height/2); 
     pointAnim.Duration = new Duration(TimeSpan.FromSeconds(5)); 

     Storyboard.SetTarget(pointAnim, connectorCurve); 
     Storyboard.SetTargetProperty(pointAnim, new PropertyPath(BezierSegment.Point3Property)); 
     board.Children.Add(pointAnim); 
     board.Begin(); 

कुछ भी नहीं चलता है। मुझे संदेह है कि मैं SetTarget या SetTargetProperty को खिला रहा हूं, लेकिन इसे समझने में प्रतीत नहीं होता है। क्या किसी को WPF में एनिमेटिंग लाइन/बेजियर पॉइंट्स के साथ अनुभव है?

+0

मुझे यकीन नहीं है कि आपकी समस्या का समाधान होगा, लेकिन आप इस पोस्ट में कुछ प्रेरणा पा सकते हैं: http://www.japf.fr/?p=227 –

उत्तर

0

http://msdn.microsoft.com/en-us/library/system.windows.media.animation.storyboard(VS.95).aspx का कहना है:

स्टोरीबोर्ड सदस्यों पेज के निर्माता के भीतर (उदाहरण के लिए शुरू) कॉल करने का प्रयास न करें। इससे एनीमेशन चुपचाप विफल हो जाएगा।

..in मामले आपको लगता है कि कर रहे थे!

उस पृष्ठ पर नमूना भी अवधि स्टोरीबोर्ड ऑब्जेक्ट की संपत्ति सेट करता है।

अंत में एक सामान्य टिप, यूआई वस्तुओं और अजीब XAML वस्तु रेखांकन के इन प्रकार के साथ एक बार आप सबसे अच्छा काम कर रहे एक ResourceDictionary में रख और 'संसाधन [ "नाम"] स्टोरीबोर्ड के रूप में' के लिए की तरह कुछ का उपयोग करने के मूल बातें मिल गया है बाद में इसे वापस प्राप्त करें।

आशा है कि उपयोगी है: की तरह लापता अवधि चाल करना चाहिए लग रहा है।

संपादित करें: ऐसा लगता है कि अवधि डिफ़ॉल्ट रूप से स्वत: हो जाता है, मुझे लगता है मैं अपने कोड से निर्मित और क्या मैं के साथ आ सकते हैं देखेंगे, मेरे साथ सहन कृपया .. :)

2

, और यह काम करता है:

Storyboard.SetTarget(pointAnim, connector); 
Storyboard.SetTargetProperty(pointAnim, new PropertyPath("Data.Figures[0].Segments[0].Point3")); 

कि ठीक करता है यह यह :) लगता है कि लक्ष्य नियंत्रण में ही होने की जरूरत है।

एक कदम जा रहे हैं नीचे, इस तरह:

'[अज्ञात]' संपत्ति पथ 'आंकड़े में मूल्य [0] .Segments [:

Storyboard.SetTarget(pointAnim, connectorGeometry); 
Storyboard.SetTargetProperty(pointAnim, new PropertyPath("Figures[0].Segments[0].Point3")); 

... InvalidOperationException देता है 0] .point3 '' System.Windows.Media.PathFigure 'के अपरिवर्तनीय उदाहरण के लिए इंगित करता है।

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