5

मैं मेट्रो एक्सएएमएल ऐप में कुछ स्टोरीबोर्ड के साथ गड़बड़ कर रहा हूं। मुझे कोड में Storyboard बनाना है। XAML इस तरह दिखता में मैं Storyboard.TargetPropertyCompositeTransform.Rotation कोस्टोरीबोर्ड सेट नहीं कर सकता। लक्ष्यप्रदर्शन को कंपोजिट ट्रान्सफॉर्म। कोड से मेट्रो स्टाइल ऐप में रोटेशन

यह असंभव लगता है ...

मेरे स्टोरीबोर्ड निर्धारित करना चाहते हैं:

<Storyboard> 
    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.Rotation)" Storyboard.TargetName="grid"> 
     <EasingDoubleKeyFrame KeyTime="0" Value="0"/> 
     <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="60"/ 
    </DoubleAnimationUsingKeyFrames> 
</Storyboard> 

मैं कुछ इसी तरह बनाना चाहते हैं।
महत्वपूर्ण: मैं को इस सटीक स्टोरीबोर्ड को फिर से बनाने की कोशिश नहीं कर रहा हूं। मैं एक कस्टम ContentControl के कोड के अंदर हूं, इसलिए thisControl है, और एनीमेशन को लक्षित करने के लिए कोई "ग्रिड" नहीं है। लक्ष्य स्वयं नियंत्रण है, जिसमें CompositeTransform पहले सेट है। जैसे ही यह विधि शुरू मैं एक अपवाद कह रही है कि (CompositeTransform.Rotation) मिलता है हल नहीं किया जा सकता है हिट

var turnSB = new Storyboard(); 

var doubleAnim = new DoubleAnimationUsingKeyFrames(); 
doubleAnim.KeyFrames.Add(new EasingDoubleKeyFrame() { KeyTime = TimeSpan.FromMilliseconds(0), Value = currentAngle }); 
doubleAnim.KeyFrames.Add(new EasingDoubleKeyFrame() { KeyTime = TimeSpan.FromMilliseconds(500), Value = targetAngle }); 

turnSB.Children.Add(doubleAnim); 

Storyboard.SetTarget(doubleAnim, this.RenderTransform); 
Storyboard.SetTargetProperty(doubleAnim, "(CompositeTransform.Rotation)"); 

turnSB.Begin(); 

:

मेरे कोड अब तक इस तरह है। तो मुझे लगता है कि मुझे संपत्ति पथ बिल्कुल सही नहीं मिला। मैंने अलग-अलग बदलावों की कोशिश की है, लेकिन प्रॉपर्टीपैथ के अनुसार, यह सही होना चाहिए, है ना? : एस

इस एक न सुलझा हुआ समस्या है, तो मैं एक समाधान पर सुझाव के लिए खुले हूँ ...

संपादित करें:

मुझे लगता है कि मैं अब के लिए समस्या को हल कर दिया है। हालांकि मेरे पास कुछ दिलचस्प निष्कर्ष हैं ...

यदि मैं उपयोगकर्ता नियंत्रण करता हूं तो मैं व्यावहारिक रूप से कुछ भी कर सकता हूं। सबकुछ काम करता है, मैं स्टोरीबोर्ड सेट कर सकता हूं। लक्ष्यप्रदर्शन, और एनीमेशन सही ढंग से खेलता है।

हालांकि अगर मैं कस्टम नियंत्रण का उपयोग करता हूं, या किसी अन्य नियंत्रण से प्राप्त करता हूं (ContentControl कहें), तो मैं कुछ मामलों में कोड से स्टोरीबोर्ड शुरू नहीं कर सकता।

उदाहरण के लिए: यदि मैं रोटेशन (या उस मामले के लिए कोई परिवर्तन संपत्ति) को एनिमेट करने के लिए स्टोरीबोर्ड (एक्सएएमएल में परिभाषित) बनाता हूं और कोड से शुरू करने का प्रयास करता हूं, तो मुझे उपरोक्त अपवाद मिलता है। लेकिन अगर मैं एक साधारण संपत्ति को एनिमेट करता हूं, तो ओपेसिटी कहें, यह ठीक काम करता है।
(मैंने UserControl के साथ ऐसा किया, और यह काम किया।)

क्या कोई इसे समझा सकता है?

+0

मैं एक ही समस्या हो रहा है, ग्रिड नियंत्रण से एक वर्ग इनहेरिट होने, स्टोरीबोर्ड बस जीता ': मैं इसे अपने स्वयं के नियंत्रण में काम कर रहे तो एक छोटा सा उदाहरण आप पेस्ट कॉपी कर सकते हैं (untested कोड) बनाया है टी शुरू करो। –

+0

ध्यान देने योग्य एक बात यह है कि ग्रिड को नियंत्रण से विरासत में नहीं मिला है, इसलिए यह वास्तव में एक कस्टम नियंत्रण नहीं है जिसे आप बना रहे हैं। –

+0

मैं ग्रिड का उपयोग नहीं कर रहा था, मैं ContentControl से विरासत में था। Xaml पिछली कोशिश से था, जहां मेरे पास UserControl था जिसमें इसमें ग्रिड था, और वह एनीमेशन का लक्ष्य था। लेकिन इस स्थिति के लिए, लक्ष्य ही नियंत्रण होना चाहिए। कौन सा - यदि आप ध्यान से पढ़ते हैं - मैंने 'महत्वपूर्ण' खंड में वर्णित किया है। – Tenshiko

उत्तर

4

MSDN docs से ऐसा लगता है कि आपको संपूर्ण स्ट्रिंग पथ सेट करने की आवश्यकता है। मिले इस blog post जो स्टोरीबोर्ड के एक बच्चे के रूप में समय कहते हैं : एनीमेशन अपने XAML में वर्णित के लिए तो, आप TargetProperty ऐसे

Storyboard.SetTargetProperty(doubleAnim, "(UIElement.RenderTransform).(CompositeTransform.Rotation)"); 

अद्यतन के रूप में स्थापित करने की आवश्यकता होगी। निम्नलिखित का प्रयास करें:

Storyboard.SetTarget(doubleAnim, this.RenderTransform); 
Storyboard.SetTargetProperty(doubleAnim, "Rotation"); // maybe "CompositeTransform.Rotation" 
storyboard.Children.Add(doubleAnim); 
+0

मैंने इनके हर संयोजन की कोशिश की है। परिणाम हमेशा एक ही थे। – Tenshiko

+0

मैं निष्कर्ष पर आया हूं कि समस्या स्टोरीबोर्ड सेटिंग के साथ नहीं है। असल में आपका पहला सुझाव अब काम करता है, लेकिन केवल UserControls के साथ। मैं विषय के बारे में अधिक जानना चाहता हूं, शायद कोई इस पर कुछ प्रकाश डाल सकता है। लेकिन अगर नहीं, तो मैं आपका जवाब स्वीकार करूंगा। Thx :) – Tenshiko

+0

तो यह एक कस्टम नियंत्रण के भीतर है? –

4

मुझे लगता है कि कारण यह है कि आप इस त्रुटि मिलती है, क्योंकि आप कस्टम नियंत्रण के RenderTransform संपत्ति का दृष्टांत नहीं किया।

public class CustomControl2 : Control 
{ 
    public CustomControl2() 
    { 
     this.DefaultStyleKey = typeof(CustomControl2); 
    } 

    protected override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 
    } 

    public void RunAnimation() 
    { 
     //this.RenderTransform = new CompositeTransform(); 
     this.Background = new SolidColorBrush(Color.FromArgb(0xFF, 0x33, 0xC8, 0x9C)); 

     var turnSB = new Storyboard(); 

     var doubleAnim = new DoubleAnimationUsingKeyFrames(); 
     doubleAnim.KeyFrames.Add(new EasingDoubleKeyFrame() { KeyTime = TimeSpan.FromMilliseconds(0), Value = 10 }); 
     doubleAnim.KeyFrames.Add(new EasingDoubleKeyFrame() { KeyTime = TimeSpan.FromMilliseconds(500), Value = 30 }); 

     turnSB.Children.Add(doubleAnim); 

     Storyboard.SetTarget(doubleAnim, this.RenderTransform); 
     Storyboard.SetTargetProperty(doubleAnim, "(CompositeTransform.Rotation)"); 

     turnSB.Begin(); 
    } 
} 

उपरोक्त कोड में ध्यान दें, यदि मैं विधि RunAnimation के तहत पहली पंक्ति बाहर टिप्पणी, यह मेरे लिए एक ही त्रुटि मिल रहा है फेंक देते हैं।

मैंने फिर अपने मुख्य पृष्ठ में यह नियंत्रण बनाया, और एनीमेशन को बंद करने के लिए Button भी बनाया।

private void Button_Click_1(object sender, RoutedEventArgs e) 
{ 
    this.MyControl.RunAnimation(); 
} 

मैंने कोड के ऊपर परीक्षण किया और यह ठीक काम किया।

+0

मुझे लगता है कि यह क्यों काम करना चाहिए, लेकिन जैसा कि मैंने अपनी मूल पोस्ट में कहा था, मैंने डीआईडी ​​परिवर्तन को स्थापित किया है (कृपया फिर से 'महत्वपूर्ण' अनुभाग पढ़ें)। और और भी, मैं एक सरल समाधान के साथ एक ही प्रभाव को पुन: उत्पन्न करने में सक्षम था। मुझे इसे फिर से जांचने दें और फिर आप पर वापस आएं। – Tenshiko

+0

एक बात जो मैं सोच सकता हूं, हो सकता है कि आप 'ऑनएप्ली टेम्पलेट' कहलाए जाने से पहले पहले से ही एमीमेशन शुरू कर दें? –

1

इसे हल

समस्या तत्व आप का उपयोग करने के रास्ते में है, अपनी मूल वर्ग अपनी संपत्ति ही करने के लिए प्रदान से प्राप्त करने के है।

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using Windows.UI.Xaml; 
using Windows.UI.Xaml.Controls; 
using Windows.UI.Xaml.Media; 
using Windows.UI.Xaml.Media.Animation; 

namespace CustomControls 
{ 
    /// <summary> 
    /// Author: Frank Wolferink 
    /// Note: example is untested and comes as is. I hope it save's you the time i lost figering this out 
    /// </summary> 
    public class CustomControl : Control 
    { 

     private Storyboard _compositeTransformExampleStoryBoard; 

     private const string TRANSLATE_X_TARGET = "Control.RenderTransform.CompositeTransform.TranslateX"; 
     private const string TRANSLATE_Y_TARGET = "Control.RenderTransform.CompositeTransform.TranslateY"; 
     private const string TRANSLATE_ROTATE_TARGET = "Control.RenderTransform.CompositeTransform.Rotation"; 


     public CustomControl() 
     { 
      this.RenderTransform = new CompositeTransform(); 

      TimeSpan duration = new TimeSpan(0,0,0,0,500); 
      double translateX = 10; 
      double translateY = 10; 
      double rotation = 40; 

      _compositeTransformExampleStoryBoard = BuildStoryboard(duration, translateX, translateY, rotation); 

      this.Loaded += CustomControl_Loaded; 
     } 

     void CustomControl_Loaded(object sender, RoutedEventArgs e) 
     { 
      _compositeTransformExampleStoryBoard.Begin(); 
     } 


     private Storyboard BuildStoryboard(TimeSpan animationDuration, double transistionValueX, double transistionValueY, double rotation) 
     { 
      Storyboard storyboard = new Storyboard(); 

      if (transistionValueX != 0) 
       CreateAnimation(storyboard, transistionValueX, animationDuration, TRANSLATE_X_TARGET); 

      if (transistionValueY != 0) 
       CreateAnimation(storyboard, transistionValueY, animationDuration, TRANSLATE_Y_TARGET); 

      if (rotation != 0) 
       CreateAnimation(storyboard, rotation, animationDuration, TRANSLATE_ROTATE_TARGET); 


      return storyboard; 
     } 

     private void CreateAnimation(Storyboard storyboard, double transistionValue, TimeSpan animationDuration, string targetProperty) 
     { 
      DoubleAnimation da = CreateDoubleAnimation(transistionValue, animationDuration); 
      storyboard.Children.Add(da); 
      Storyboard.SetTarget(da, this); 
      Storyboard.SetTargetProperty(da, targetProperty); 
     } 

     private DoubleAnimation CreateDoubleAnimation(double transistionValue, TimeSpan duration) 
     { 
      return new DoubleAnimation() 
      { 
       Duration = duration, 
       To = transistionValue 
      }; 
     } 

    } 
} 

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