애니메이션 완료시 프레임 워크 타입 제거
-
13-09-2019 - |
문제
나는 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);