【发布时间】:2011-04-04 05:37:34
【问题描述】:
我有两个 WPF(来自标准集)小部件 A 和 B。当我更改 A 的某些属性时,它应该设置在 B 上,当它在 B 中更改时,它应该设置在 A 上。
现在我有这个丑陋的递归 --> 我改变了 A,所以代码改变了 B,但是由于 B 改变了,它改变了 A,所以它改变了 B......你有图片。
如何以最“标准”的方式避免这种递归?天真的删除和添加事件处理程序不起作用,并且检查新值是否与旧值相同在这里不适用(因为计算的波动 - 我没有将相同的值设置为 A 和 B,而是转换) .
背景
我总是尽量提供有关问题的最少信息以避免混淆。但是,这可能会有所帮助
- 这些小部件不是我写的,我只是处理事件,仅此而已
-
尽管标题为“递归触发”,但处理程序是按顺序调用的,因此您的顺序是 entry-exit-entry-exit-entry-exit,而不是 entry-entry-entry-exit-exit-exit
最后一个,可能是最不重要的,但尽管如此
- 在这种特殊情况下,我有 A 和 B 的通用处理程序
A 和 B(在这种情况下)是滚动查看器,我尝试按比例为它们保持相同的位置。该项目(由 Karin Huber 设计)在这里: http://www.codeproject.com/KB/WPF/ScrollSynchronization.aspx
事件触发
阻塞事件的想法非常流行,我添加了触发事件的顺序,我们开始:
- 我换A了
- 处理程序被调用
- 我禁用了 A 的处理程序
- 我更改 B(已存储,但未触发)
- 我启用 A 的处理程序
- 现在从队列中获取事件
- B 处理程序被调用
- 我禁用 B 的处理程序
- 我换A了
- ...
如你所见,这是徒劳的。
【问题讨论】: