locked
בעיה עם איבנט PointerEntered RRS feed

  • שאלה

  • היי,

    אני רוצה לעשות משהו מאוד פשוט: כאשר עכבר שלי מעל אלמנט מסויים (נניח, תמונה), לבצע אנימאציה של שינוי גודל. עד כמה שידוע לי, האיבנט המתאים לצורך זה הוא "PointerEntered" (או שלא...). הבעיה היא, שכאשר אני מנסה להגדיר אותו באיבנט טריגר, האפליקציה קורסת. אם למשל, אני מנסה איבנט אחר (כגון loaded) - הכל עובד פיקס.

    הינה קוד להמחשה:

    <Image Width="100" Height="100" Source="Assets/Navigate/Arrows1.png" x:Name="image">
                <Image.Triggers>
                    <EventTrigger
                    RoutedEvent="UIElement.PointerEntered">
                        <BeginStoryboard>
                            <Storyboard>
                                <DoubleAnimation
                                Storyboard.TargetName="image"
                                Storyboard.TargetProperty="Opacity"
                                From="1.0"
                                To="0.0"
                                Duration="0:0:1"
                                AutoReverse="True"
                                RepeatBehavior="Forever" />
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>
                </Image.Triggers>
            </Image>

    נ.ב. כן, אני יודע לפחות 2 דרכים נוספות שבהם אפשר לעשות את מה שאני רוצה. אני רוצה להבין למה הטריגר של PointerEntered לא עובד - זה עניין של עיקרון.

    תודה מראש,

    יבגני


    אתם מוזמנים לבקר בבלוג של חברה שלנו - כל שבוע יש משהו חדש: http://concepttechnologies.net/blog

    יום שלישי 09 אוקטובר 2012 16:49

תשובות

כל התגובות

  • לדעתי מי שאחראי על PointerEntered הוא PointerEventHandler לעומת Loaded שעליו אחראי RoutedEventHandler.
    RoutedEvent ב - EventTrigger מצפה ל - RoutedEventHandler ואתה מביא לו PointerEventHandler.

    בשביל להיות בטוח אפשר לעשות בדיקה קטנה :

    object obj = new object();
    EventTrigger eventTrigger = new EventTrigger();
    eventTrigger.RoutedEvent = (PointerEventHandler)obj;

    ולראות שהקומפלייר צועק עליך שהוא לא יכול לעשות את ההשמה הזאת.

    בכל מקרה באיזה סביבת עבודה אתה מפתח ? ב - VS 2012 כבר ב - Design הוא מראה לי את הקונפליקט הזה.

    מוטי.

    יום שני 15 אוקטובר 2012 23:34
  • שלום מוטי,

    כמובן שבדיקה שעשית לא מתקמפלת, כי אתה מכניס לתוך טריגר שמצפה לאיבט את ה-דלגט (RoutedEvent != RoutedEventHandler)

    public sealed class EventTrigger : TriggerBase
        {
            // Summary:
            //     Initializes a new instance of the EventTrigger class.
            public EventTrigger();
    
            // Summary:
            //     Gets the collection of BeginStoryboard objects that this EventTrigger maintains.
            //
            // Returns:
            //     The existing TriggerActionCollection.
            public TriggerActionCollection Actions { get; }
            //
            // Summary:
            //     Gets or sets the name of the event that initiates the trigger.
            //
            // Returns:
            //     The name or identifier of the event.
            public RoutedEvent RoutedEvent { get; set; }
        }

    אני כן התרשמתי שאיבנט PointerEntered הינו ראוטד. ראשית - זה מה שכתוב ב- MSDN (http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.uielement.pointerentered#Y100):

    Remarks

    This event is a routed event. For more info on the routed event concept, see Events and routed events overview.

    שנית, אם תסתכל במטה דטה של UIElement, תראה שזה מה שכתוב:

     //
            // Summary:
            //     Gets the identifier for the PointerEntered routed event.
            //
            // Returns:
            //     The identifier for the PointerEntered routed event.
            public static RoutedEvent PointerEnteredEvent { get; }
            //
            // Summary:
            //     Gets the identifier for the PointerExited routed event.
            //
            // Returns:
            //     The identifier for the PointerExited routed event.
            public static RoutedEvent PointerExitedEvent { get; }
            //
            // Summary:
            //     Gets the identifier for the PointerMoved routed event.
            //
            // Returns:
            //     The identifier for the PointerMoved routed event.
            public static RoutedEvent PointerMovedEvent { get; }
            //
            // Summary:
            //     Gets the identifier for the PointerPressed routed event.
            //
            // Returns:
            //     The identifier for the PointerPressed routed event.
            public static RoutedEvent PointerPressedEvent { get; }
            //
            // Summary:
            //     Gets the identifier for the PointerReleased routed event.
            //
            // Returns:
            //     The identifier for the PointerReleased routed event.
            public static RoutedEvent PointerReleasedEvent { get; }

    בכל מקרה, תודה על התגובתך.


    אתם מוזמנים לבקר בבלוג של חברה שלנו - כל שבוע יש משהו חדש: http://concepttechnologies.net/blog

    יום שישי 19 אוקטובר 2012 16:12
  • טוב, אז לכל המעוניינים - הינה התשובה (שקיבלתי בפורום של ארה"ב http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/7cfe0d6a-52c5-4904-96fd-ef786f870d65)

    שום ראודט איבנט, פרט ל- Loaded, אינו נתמך ע"י EventTrigger ב- WinRT. במקום זה, יש להשתמש ב- VSM. הם יתקנו דוקומנטציה ב- MSDN.

    יבגני


    אתם מוזמנים לבקר בבלוג של חברה שלנו - כל שבוע יש משהו חדש: http://concepttechnologies.net/blog

    • סומן כתשובה על-ידי Aizikovich Evgeni יום חמישי 25 אוקטובר 2012 16:13
    יום חמישי 25 אוקטובר 2012 16:13