winforms 在非常短的时间内产生的多个WPF调整大小事件中,只取第一个产生的WPF调整大小事件[已关闭]

1zmg4dgp  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(215)

**已关闭。**此问题需要debugging details。当前不接受答案。

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
3天前关闭。
Improve this question
我有一个有点复杂的场景,我将尝试简单地解释一下。我有一个Outlook VSTO加载项。Outlook有一个名为自定义任务窗格的对象,您可以在其中嵌入winforms用户控件。我有一个WPF用户控件,我需要将其嵌入到该自定义任务窗格中,但我是通过ElementHost完成的。首先,我将WPF控件嵌入到从winform用户控件继承的ElementHost中,最后,我将ElementHost嵌入到Outlook自定义任务窗格中。
现在,从外接程序(实际上是一个winforms应用程序)方面来看,我已经订阅了WPF用户控件resize事件(特别是高度)。因此,当WPF控件调整大小时,该事件将传播到winforms应用程序(外接程序),我将执行一些操作。
我遇到的问题是,当您通过执行鼠标按下并拖动来调整WPF控件的大小时,WPF resize事件在短时间内开始触发很多次,并且它会无限期地继续触发,直到您执行鼠标抬起为止。在这种情况下,我对捕获第一个事件并丢弃其余事件感兴趣。我如何才能做到这一点?

zwghvu4y

zwghvu4y1#

您可以使用在行程事件之前检查的旗标。按下鼠标器时设定此旗标,放开鼠标器时清除此旗标。
处理第一个事件:

private bool IsSizeChangedHandled { get; set; }

private void OnSizeChanged(object sender, EventArgs e)
{
  if (this.IsSizeChangedHandled)
  {
    return;
  }

  this.IsSizeChangedHandled = true;

  // TODO::Handle event
}

// Reset the flag
private void OnMouseUp(object sender, EventArgs e)
  => this.IsSizeChangedHandled = true;

处理最后一个事件:

private bool IsSizeChangedHandled { get; set; } = true;

// Reset the flag
private void OnSizeChanged(object sender, EventArgs e)
  => this.IsSizeChangedHandled = false;

private void OnMouseUp(object sender, EventArgs e)
{
  if (this.IsSizeChangedHandled)
  {
    return;
  }  

  this.IsSizeChangedHandled = true;

  // TODO::Handle event
}

相关问题