1

好的,所以我的 xaml 中有一个用户控件内的图像元素

<Image HorizontalAlignment="Left" Margin="0,0,0,0" Name="imagePiece" Stretch="Fill" VerticalAlignment="Top" Source="{Binding Path=PieceGrid}" />

在我在构造函数后面的代码中:

AddHandler(FrameworkElement.MouseDownEvent, new MouseButtonEventHandler(imagePiece_MouseDown), true);
AddHandler(FrameworkElement.MouseUpEvent, new MouseButtonEventHandler(imagePiece_MouseUp), true);

我动态地创建了几个这样的用户控件。mousedown 和 mouseup 工作得很好,完全按照我的意愿去做。我可以不断地单击图像,并且每次都会触发该事件。

但是,我实现了一个每隔一段时间触发一次的 Timer 对象。那个计时器改变了图像。为了做到这一点,我必须这样做:

private void releaseTheDaemon(object source, ElapsedEventArgs e)
{
  int numberOfPieces = 0;
  List<GridPieceView> allPlacedPieces = new List<GridPieceView>();

  foreach (List<GridPieceView> list in piece)
  {
    foreach (GridPieceView p in list)
    {
      if (p.GridOwner != View.Owner.NotSelected)
      {
        allPlacedPieces.Add(p);
        numberOfPieces = numberOfPieces + 1;
      }
    }
  }

  int randIndex = randomNumber.Next(0, numberOfPieces);
  if (allPlacedPieces.Count > 0)
  {
    Dispatcher.Invoke(DispatcherPriority.Normal, new Action<GridPieceView>(daemonActions), allPlacedPieces[randIndex]);
  }
}

private void daemonActions(GridPieceView gridPiece)
{
  gridPiece.GridOwner = View.Owner.NotSelected;
  gridPiece.setPieceWhite();
}

setPieceWhite() 方法用于更新视图。在该更新发生后,mousedown 和 mouseup 将丢失。他们不会开火。

对于踢腿和咯咯笑,我尝试对方法执行此操作:

private void daemonActions(GridPieceView gridPiece)
{
  gridPiece.GridOwner = View.Owner.NotSelected;
  gridPiece.setPieceWhite();
  AddHandler(FrameworkElement.MouseDownEvent, new MouseButtonEventHandler(gridPiece.imagePiece_MouseDown), true);
  AddHandler(FrameworkElement.MouseUpEvent, new MouseButtonEventHandler(gridPiece.imagePiece_MouseUp), true);
}

但这确实搞砸了事件,每当我点击其中一张图像时,之前通过此方法的所有其余图像也会被触发。

无论如何,有人知道我应该如何处理这个问题吗?

4

0 回答 0