在 C# 中重新订阅自定义事件说事件名称不在当前上下文中
Resubscribing to custom event in C# says event name not in the current context
在我的 WPF 项目中,我有一个在一秒钟内滑动的网格。我在其中一个上通过 mouseEnter 触发了这个。
MouseEnter -> OnMouseEnter() -> MoveMicroGrid 为每个网格运行以移动它们。
我意识到 MouseEnter 事件在整个动画中继续处于活动状态,即使未完成也重新开始。所以我添加了 SlideCompleted 事件,并尝试取消订阅并重新订阅 Grid_0_0 from/to,这样就不会中断动画。
在 Slide Completed 方法中,我被告知“名称 'OnMouseOver' 在当前模型中不存在”。是什么导致了这个问题,是否有更好的方法来处理暂停 'always active' 事件?
PS:省略了一些代码,但包含了我认为与该问题相关的所有部分。不知道这对这个网站是否合适...
private void MoveMicroGrid(Grid g, Direction direction) {
g.RenderTransform = new TranslateTransform(0, 0);
Duration duration = new Duration(new TimeSpan(0, 0, 0, 1, 0));
DoubleAnimation anim;
switch (direction) {
case Direction.Up:
anim = new DoubleAnimation(-microGridDistanceY, duration);
anim.Completed += new EventHandler(SlideCompleted);
g.RenderTransform.BeginAnimation(TranslateTransform.YProperty, anim);
break;
case Direction.Down:
anim = new DoubleAnimation(microGridDistanceY, duration);
anim.Completed += new EventHandler(SlideCompleted);
g.RenderTransform.BeginAnimation(TranslateTransform.YProperty, anim);
break;
case Direction.Left:
anim = new DoubleAnimation(-microGridDistanceX, duration);
anim.Completed += new EventHandler(SlideCompleted);
g.RenderTransform.BeginAnimation(TranslateTransform.XProperty, anim);
break;
case Direction.Right:
anim = new DoubleAnimation(microGridDistanceX, duration);
anim.Completed += new EventHandler(SlideCompleted);
g.RenderTransform.BeginAnimation(TranslateTransform.XProperty, anim);
break;
}
}
private void SlideCompleted(object sender, EventArgs e)
{
Grid_0_0.MouseEnter += new MouseEventHandler(OnMouseOver); //<-- This is the error line
ResetBoardSlide();
}
private void OnMouseEnter(object sender, MouseEventArgs e)
{
Grid_0_0.MouseEnter -= OnMouseEnter;
SlideBoard(Direction.Down);
}
您似乎输错了事件处理程序的名称。在 SlideCompleted()
方法中,你得到了这个:
Grid_0_0.MouseEnter += new MouseEventHandler(OnMouseOver);
但是您在示例中提供的事件处理程序称为 OnMouseEnter
,而不是 OnMouseOver
。我怀疑这就是您看到该错误消息的原因。因此,您可以重命名有问题的方法,或将上面的行更改为:
Grid_0_0.MouseEnter += new MouseEventHandler(OnMouseEnter);
在我的 WPF 项目中,我有一个在一秒钟内滑动的网格。我在其中一个上通过 mouseEnter 触发了这个。 MouseEnter -> OnMouseEnter() -> MoveMicroGrid 为每个网格运行以移动它们。 我意识到 MouseEnter 事件在整个动画中继续处于活动状态,即使未完成也重新开始。所以我添加了 SlideCompleted 事件,并尝试取消订阅并重新订阅 Grid_0_0 from/to,这样就不会中断动画。
在 Slide Completed 方法中,我被告知“名称 'OnMouseOver' 在当前模型中不存在”。是什么导致了这个问题,是否有更好的方法来处理暂停 'always active' 事件?
PS:省略了一些代码,但包含了我认为与该问题相关的所有部分。不知道这对这个网站是否合适...
private void MoveMicroGrid(Grid g, Direction direction) {
g.RenderTransform = new TranslateTransform(0, 0);
Duration duration = new Duration(new TimeSpan(0, 0, 0, 1, 0));
DoubleAnimation anim;
switch (direction) {
case Direction.Up:
anim = new DoubleAnimation(-microGridDistanceY, duration);
anim.Completed += new EventHandler(SlideCompleted);
g.RenderTransform.BeginAnimation(TranslateTransform.YProperty, anim);
break;
case Direction.Down:
anim = new DoubleAnimation(microGridDistanceY, duration);
anim.Completed += new EventHandler(SlideCompleted);
g.RenderTransform.BeginAnimation(TranslateTransform.YProperty, anim);
break;
case Direction.Left:
anim = new DoubleAnimation(-microGridDistanceX, duration);
anim.Completed += new EventHandler(SlideCompleted);
g.RenderTransform.BeginAnimation(TranslateTransform.XProperty, anim);
break;
case Direction.Right:
anim = new DoubleAnimation(microGridDistanceX, duration);
anim.Completed += new EventHandler(SlideCompleted);
g.RenderTransform.BeginAnimation(TranslateTransform.XProperty, anim);
break;
}
}
private void SlideCompleted(object sender, EventArgs e)
{
Grid_0_0.MouseEnter += new MouseEventHandler(OnMouseOver); //<-- This is the error line
ResetBoardSlide();
}
private void OnMouseEnter(object sender, MouseEventArgs e)
{
Grid_0_0.MouseEnter -= OnMouseEnter;
SlideBoard(Direction.Down);
}
您似乎输错了事件处理程序的名称。在 SlideCompleted()
方法中,你得到了这个:
Grid_0_0.MouseEnter += new MouseEventHandler(OnMouseOver);
但是您在示例中提供的事件处理程序称为 OnMouseEnter
,而不是 OnMouseOver
。我怀疑这就是您看到该错误消息的原因。因此,您可以重命名有问题的方法,或将上面的行更改为:
Grid_0_0.MouseEnter += new MouseEventHandler(OnMouseEnter);