7
votes

Windows 8 - Animation de la propriété personnalisée dans le code-code

Fondamentalement, je veux faire des tas de formes et les faire animation. Donc, je suis venu avec la classe personnalisée suivante: xxx

Cependant, lorsque j'essaie de faire une instance de la classe et de l'ajouter à la toile, je reçois une exception - Storyboard.being () le jette et me dit que cela ne peut pas trouver la propriété d'animateur.

SO - Qu'est-ce que je fais mal?

EDIT: après 3 modifications de code - c'est toujours Ca ne fonctionne pas; Je reçois "Impossible de résoudre TargetProperty Animator sur l'erreur d'objet spécifié". Donc, si quelqu'un connaît la réponse - veuillez vous aider en modifiant le code. Merci!

EDIT: OK, après 24 heures de frapper la tête contre le mur, il y a des progrès, si j'ajoute de la forme via XAML, il anime, mais si je l'ajoute via le code Derrière (canvas.children.add), ça ne marche pas. Laissez-moi voir si je peux comprendre pourquoi.


4 commentaires

C'est exactement le même problème que je suis confronté à guichet automatique. Si vous trouvez une solution, veuillez le poster ici, je le ferai donc.)


Je pense que cela est associé: Charlespetzold.com/blog/2012/03/...


Eh bien, cet article est lié à celui-ci blog.jerrynixon .COM / 2012/06 / Windows-8-Animated-Pie-SLICE.HTM L


@Jerrynixon Oh oui - TNX pour lier votre blog aussi - vous avez de bons messages là-bas.


4 Réponses :


1
votes

Oui, vous devez définir cette propriété comme une propriété de dépendance, pas seulement une propriété CLR régulière. Cela implique un peu de code de plaque de chaudière simple. Voir donc Blog Post pour un exemple complet:

http: //timheuer.com/blog/archive/2012/03/07/créating-custom-controls-for-metro-style-apps.aspx


5 commentaires

Je viens d'essayer de l'enregistrer comme dépendanceProperty (code mis à jour) et j'ai la même erreur


Votre chemin de propriété est faux, votre objet cible est un Funkyshape , comme spécifié dans cet énoncé Storyboard.SetTarget (G1, this); Votre propriété cible doit donc être Animateur , scénariste.settargetProperty (g1, "animateur"); - En outre, vous devez ajouter un gestionnaire à l'événement modifié de dépendanceProperty afin de mettre à jour votre interface utilisateur car la propriété de dépendance est Animé.


@Coline: L'animation n'appellera pas la séchis de la propriété, non? Mais cela appellerait-il un caractère de propriétéCallageDcallback?


Oui, cela n'appelle pas votre constructeur de propriétés, il modifie directement le DP. Pour cette raison, vous devez gérer le rappel modifié.


Ok, à ce stade, je pense que vous vous rendantez de nous, j'ai de nouveau changé le code et j'ai la même erreur: "Impossible de résoudre TargetProperty Animator sur un objet spécifié.". Si vous connaissez la solution, pouvez-vous s'il vous plaît modifier le code et nous aider à sortir?



3
votes

Dans Windows 8, vous ne pouvez pas animer des propriétés personnalisées sans définir également la propriété en compatibilitéAnimation à la réalité. En effet, les animations non déterministes sont désactivées par défaut.

Référence: http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.media.animation.pointanimation.EnableableAnimation.aspx


3 commentaires

Comme dit sur le chat, j'ai - cultivé. - Ligne, donc ce n'est pas ça.


@Floriangl Pouvez-vous poster votre classe? Parce que cela ne fonctionne évidemment pas pour le mien?


Il n'y a rien de différent de votre classe, mais le storyboard est placé dans l'usercontrol correspondant de la viewModel (propriété animée est dans une vue de vue).



6
votes

OK,

J'ai trouvé la solution de contournement pour ce qui est évidemment un bug dans le cadre (bien que certains employés de MS postérièrent une réponse et disent que c'est une fonctionnalité / IT-IS-SY-DESITION). Plusieurs choses doivent être faites:

  1. Ajoutez de la valeur par défaut / paramétrage constructeur
  2. Changer la classe de base de Funkyshape vers UserControl.
  3. Ouvrez la vue XAML de la classe de la page où vous souhaitez ajouter des formes
  4. Ajoutez une instance de Funkyshape comme un enfant dans la toile XAML ( Par exemple). ça ne fonctionnera pas sans cela.
  5. Faites une instance de Funkyshape dans Code-Derrière, ajoutez-la à la toile, commencez à l'animation et aimez-vous voir que cela fonctionne
  6. Passez à la technologie moins de buggy.

2 commentaires

L'ajout d'une instance à XAML l'a réalisée pour moi; Merci pour le conseil. Mais malheureusement, ce n'est pas une solution viable pour moi, car je ne veux vraiment pas d'un constructeur sans paramètre sur ma classe (cela n'aurait aucun sens). Je soupçonne que cela fonctionne car le compilateur XAML génère des métadonnées sur les types utilisés dans XAML, et le storyboard exige que les métadonnées. Je vous ferai savoir si je trouve une meilleure solution de contournement.


Étape 4 Peut-être que la réponse de Tim Heuer à social.msdn.microsoft.com/forums/windowsapps/en-us/...



1
votes

OK, j'ai aussi eu ce problème, mais je ne voulais pas inclure d'un constructeur sans paramètre public dans ma classe, alors j'ai trouvé une autre manière.

Fondamentalement, le problème est que WinRT est une plate-forme natale et ne peut pas faire de la réflexion sur le code .NET. C'est pourquoi le processus de construction des applications WinRT génère des métadonnées sur les types utilisés dans XAML (vous pouvez trouver le code correspondant dans obj / (débogage de débogage) /xamltypeinfo.g.cs ).

Si un type n'est jamais utilisé dans XAML, aucune métadonnée à propos de ce type est générée, ce qui signifie (entre autres) que vous ne pouvez pas animer les propriétés du type.

Si vous écrivez une bibliothèque de classe, vous pouvez simplement inclure un dictionnaire de ressources XAML et déclarer une instance factice du type; Il provoquera généré des métadonnées. Cependant, il faut que le type ait un constructeur sans paramètre public, qui pourrait ne pas être souhaitable.

Il y a donc une autre solution: fournir les métadonnées vous-même. Il existe plusieurs interfaces à mettre en œuvre et de nombreux membres peuvent donc être assez fastidieux à faire manuellement. Heureusement, vous n'êtes pas obligé! Voici ce que vous pouvez faire:

  • Ajouter un constructeur sans paramétrage public à la classe (temporairement)
  • Créez un document XAML Dossier et déclarer une instance de la classe en elle (comme décrit ci-dessus)
  • Copiez le fichier xamltypeinfo.g.cs dans votre projet (je l'ai renommé sur xamltypeinfo.cs )
  • Remplacez l'appel au constructeur avec lancer une nouvelle notimplementeedException ()
  • Supprimer le Dossier Fichier
  • Supprimez le constructeur sans paramétrage public

    Et vous avez terminé, l'animation fonctionne maintenant correctement.

    Le processus est toujours assez fastidieux, il serait donc agréable d'avoir un outil pour faire le travail pour nous ...


    Edit: beaucoup solution plus facile: appliquez le [liait] attribut à la classe. Il rend le générateur de métadonnées prend en compte le type même s'il n'est pas utilisé dans XAML. (Ignorer le fait que le DOC dit que c'est pour les types C ++; cela fonctionne aussi bien sur les classes C #)


0 commentaires