locked
אנימציות על אובייקטים שמיוצרים דינאמית בתוך GridView RRS feed

  • שאלה

  • יש לי GridView שמקבל data באופן דינאמי על ידי binding ל resources.

    ייצרתי ItemTemplate (שמכיל StackPanel ובתוכו אלמנטים נוספים). אני מעוניין שה Template יכיל גם אנימציה שתופעל על ה stackPanel במצב של PointerEntered, ולכן הכנסתי ל Template גם Storyboard ובתוכו PointerDownThemeAnimation.

    הבעיה שלי היא: ה StoryBoard מצריך TargetName. אם אני נותן Name ל StackPanel שב Template, ואני מציין את Name הזה כ - TargetName של ה StoryBoard, כאשר הוא מנסה להפעיל את האנימציה, הוא מודיע לי שלא נמצא אובייקט בשם זה, למרות שב debug אני רואה שהאובייקט שהרים את ה event של PointerEntered כן נקרא ב Name הנ"ל.

    אני מניח שהבעיה נובעת מכך שמדובר באובייקטים שנוצרים דינאמית, ולמרות שציינתי Name ב Template , זה לא באמת השם שבו הם מזוהים ב runtime.

    מה הדרך שבה אני יכול לזהות את ה Name האמיתי של האלמנט שהרים את ה event ולהכניס אותו ל storyboard?

    (יש ב msdn דרך איך לעשות משהו דומה ב wpf -  

    http://msdn.microsoft.com/en-us/library/bb613579.aspx

    אבל חלק מהפונקציות שמשתמשים בהם שם אינן קיימות ב Metro).

    תודה מראש!

    יום שלישי 04 ספטמבר 2012 13:54

תשובות

  • בסופו של דבר פתרתי את הבעיה, אבל בצורה מכוערת, ע"י יצירת אנימציה ב code
    behind:

    ב xaml, כשצריך לציין על אובייקט האנימציה את האלמנט שעליו מבוצעת האנימציה,
    חייבים לציין את ה TargetName, כלומר, דווקא Name. אבל ב code behind אפשר להשתמש ב
    AttachedProperty של Storyborad.SetTarget, שמקבל כפרמטר את ה instance של האובייקט
    שעליו רוצים לבצע את האנימציה, ולא צריך לציין את ה name שלו.

    ב event handler קיבלתי את האובייקט שעליו אני רוצה לבצע את האנימציה כ sender,
    וחיברתי אותו לאובייקט האנימציה כנ"ל.

    בעיה שהתעוררה בגלל זה היתה שאם האנימציה מתחילה כשהסמן נכנס לשטח האלמנט, אני
    מעוניין להפסיק את האנימציה כשהסמן יצא משטח האלמנט, אבל שם אני נמצא כבר ב event
    handler אחר, ואין לי גישה לאובייקט האנימציה שייצרתי ב event handler  הקודם. לכן
    נאלצתי לשמור את אובייקט האנימציה כ resource של האלמנט שעליו ביצעתי את האנימציה
    (גם זה ב code behind כמובן), וכך לשלוף אותו בשם ב event handler השני.

    כמובן שאי אפשר לגשת לאנימציה כזו ב blend וכדומה, והפתרון די מגעיל, אבל
    עובד.


    • סומן כתשובה על-ידי Yakov Nadler יום חמישי 06 ספטמבר 2012 14:52
    • נערך על-ידי Yakov Nadler יום חמישי 06 ספטמבר 2012 15:00
    יום חמישי 06 ספטמבר 2012 14:46