سؤال

لقد قمت بتدريس نفسي WPF من خلال عمليات البيع / Griffiths "برمجة WPF"، وقد وجدت أنه مورد كبير، لكنني أحاول التقاط بعض المفاهيم التي قدموها لي وانتقل إلى خطوة أخرى، وأنا أهرب إلى عقبة مفاهيمية حول كيفية وضع القطع معا لإنجاز ما أحاول القيام به.

في هذا التمرين، أحاول إنشاء الرسوم المتحركة التي تم إنهاء الذات؛ FrameworkElementيتم إنشاؤها بواسطة الأحداث، وأداء الرسوم المتحركة، ثم حذف نفسها. أواجه مشاكل في معرفة كيفية الاتصال مرة أخرى إلى الوالد FrameworkElement من الحدث الرسوم المتحركة.

سألت هذا السؤال في الأصل فقط باستخدام DoubleAnimationكانت التي كانت غير مطابقة وليس جزءا من Storyboard. وبعد لقد أضافت منذ ذلك الحين Storyboard, وجعلت Storyboard وموارد المستطيل حتى يمكن إعادة استخدامها بسهولة.

إليك ما لدي حتى الآن:
.xaml:

<Window.Resources>
    <Storyboard x:Key="GrowSquare" x:Shared="False">
        <DoubleAnimation Storyboard.TargetProperty="(Canvas.Top)" By="-50" Duration="0:0:2"/>
        <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" By="-50" Duration="0:0:2"/>
        <DoubleAnimation Storyboard.TargetProperty="(Ellipse.Width)" By="100" Duration="0:0:2"/>
        <DoubleAnimation Storyboard.TargetProperty="(Ellipse.Height)" By="100" Duration="0:0:2"/>
    </Storyboard>
    <Rectangle x:Key="MyRect" x:Shared="False" Width="20" Height="20">
    </Rectangle>
</Window.Resources>
<Canvas x:Name="myCanvas" MouseMove="myCanvas_MouseMove" Background="White"/>

.cs:

public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
            lastFire = DateTime.Now;
        }

        DateTime lastFire;

        private void myCanvas_MouseMove(object sender, MouseEventArgs e)
        {
            DateTime nowTime = DateTime.Now;
            TimeSpan T = nowTime.Subtract(lastFire);

            if (T.TotalMilliseconds > 200)
            {
                lastFire = nowTime;
                Random Rand = new Random();

                Rectangle myRect = (Rectangle)FindResource("MyRect");
                myRect.Fill = new SolidColorBrush(Color.FromRgb((byte)Rand.Next(256), (byte)Rand.Next(256), (byte)Rand.Next(256)));
                Point myLoc = e.GetPosition(myCanvas);
                Canvas.SetLeft(myRect, myLoc.X - 10);
                Canvas.SetTop(myRect, myLoc.Y - 10);
                myCanvas.Children.Add(myRect);

                Storyboard SB = (Storyboard)FindResource("GrowSquare");
                SB.Completed += new EventHandler(SB_Completed);
                SB.Begin(myRect);
            }

        }

        void SB_Completed(object sender, EventArgs e)
        {
            myCanvas.Children.RemoveAt(0);
        }
    }

هذا يعمل، ولكن ليس بالطريقة التي أود ذلك. نظرا لأن القماش فارغ، وجميع الرسوم المتحركة هي نفس الطول، عندما تنتهي الرسوم المتحركة، سيكون الأمر دائما هو الذي تم استدعاؤه على الطفل الأول من القماش.

ومع ذلك، أود أن أقوم بتطبيق Animaitons التي تتخذ فترة زمنية عشوائية، مما يعني أن الرسوم المتحركة لن تبدأ دائما وتنتهي بنفس الترتيب. بطريقة أو بأخرى في الحدث SB_COMPLETED، أود الوصول إلى عنصر التحكم الذي تم استدعائه، لكن لا يمكنني العثور على المسار إليه بعد.

هل هناك طريقة للوصول إليها من media.animation.clockgroup الذي يستدعي الحدث SB_COMPLETED إلى عنصر التحكم الذي يتم فيه استدعاء الرسوم المتحركة؟

هل كانت مفيدة؟

المحلول

تغيير الخط حيث تقوم بتعيين معالج الأحداث إلى هذا:

SB.Completed += (s,e) => myCanvas.Children.Remove(myRect);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top