停止WPF中的事件

本文关键字:事件 WPF 停止 | 更新日期: 2023-09-27 18:09:28

是否可以在WPF中停止/挂起引发的事件?当我的窗口触及屏幕一侧时,我想停止像SizeChanged LocationChanged MouseDown这样的事件。

现在我不能修改窗口的尺寸,因为不知何故其他事件覆盖的值。

EDIT我发现,我的问题是由覆盖我的窗口对象的事件引起的(我猜是这样),因为当我在所有事件中打印窗口尺寸时,发生了改变其他事件导致设置原始尺寸后。

停止WPF中的事件

要取消订阅事件,只需在您想要停止的地方键入this。

如:SizeChanged;

this.SizeChanged -= MethodName;

您无法暂停事件的触发。您可以使用EventHandlers取消订阅,类似于订阅它们:

object.someEventHandler -= someMethodOrDelegate

或者您可以根据特殊条件抑制事件的冒泡向上/隧道向下:

private void SomeEventHappened(object sender, RoutedEventArgs e)
{
    if(someCondition)
          e.Handled = true;
    else
          DoSomeWork();
}

根据您对问题的编辑和您的评论,据我所知,您有更改窗口尺寸的事件,这些事件阻止您手动调整窗口大小。此外,事件处理程序不是WPF发起的(它们使用EventArgs而不是RoutedEventArgs)。如果我理解正确,解决方案可能具有类作用域(或internal,根据您的需要)布尔变量,该变量保存是否允许/覆盖维度:

bool allowManualResize = false;

然后当你手动修改大小时,你将这个变量设置为true:

private void SomeManualSizingEventHandler(object sender, EventArgs e)
{
     allowManualResize = true;
     ....

之后,您可以在覆盖新值的事件中检查该值:

private void SomeUpperLevelResizeHandler(object sender, EventArgs e)
{
   // Check if resizing is allowed,
   if(!allowManualResize)
   {
       // do your default things here
   ....

当然你需要找到一个合适的位置来设置allowManualResize为false,这样将来的触发就不会被抑制。