문제

나는 Sells/Griffiths의 "Programming WPF"를 통해 WPF를 가르치고 있으며 훌륭한 자원을 찾았지만, 그들이 저를 소개 한 개념 중 일부를 가져 가려고 노력하고 있습니다. 그리고 나는 내가하려는 일을 성취하기 위해 조각을 모으는 방법에 대한 개념적 걸림돌에 빠져 있습니다.

이 연습에서는 자체 종료 애니메이션을 만들려고 노력하고 있습니다. FrameworkElement이벤트에 의해 생성되고 애니메이션을 수행 한 다음 스스로 삭제하는 s. 부모에게 다시 전화하는 방법을 알아내는 데 문제가 있습니다. FrameworkElement Animation.completed 이벤트에서.

나는 원래이 질문을 원래 사용했다 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);
        }
    }

이것은 작동하지만 내가 좋아하는 방식은 아닙니다. 캔버스가 비어 있고 모든 애니메이션이 같은 길이이므로 애니메이션이 완료되면 항상 캔버스의 첫 번째 자녀에게 호출 된 것입니다.

그러나 임의의 시간이 걸리는 애니 메이 톤을 구현하고 싶습니다. 즉, 애니메이션이 항상 같은 순서로 시작하고 끝나는 것은 아닙니다. 어쨌든 SB_Completed 이벤트에서는 전화가 요구되는 컨트롤에 액세스하고 싶습니다. 그러나 아직 그 길을 찾을 수는 없습니다.

SB_CompleTed 이벤트를 호출하는 애니메이션이 호출되는 컨트롤에 미디어에서 얻을 수있는 방법이 있습니까?

도움이 되었습니까?

해결책

이벤트 핸들러를 할당하는 선을 변경하십시오.

SB.Completed += (s,e) => myCanvas.Children.Remove(myRect);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top