fbm*_*bmd 0 c# lambda user-interface callback
我想将一组回调函数绑定到C#中的GUI元素,每个函数使用不同的参数调用相同的处理函数.
拼写出来的方式
# Assign element #1 to widget
widget.Click += () => {ProcessClick(1) ;} ;
# Assign element #2 to widget
widget.Click += () => {ProcessClick(2) ;} ;
...
Run Code Online (Sandbox Code Playgroud)
似乎多余.然而,一个天真的循环
Widget widget ;
foreach (int i in new List<int>() {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} )
{
# Assign element i to widget
widget.Click += () => {ProcessClick(i) ;} ;
}
Run Code Online (Sandbox Code Playgroud)
将无法工作,因为一旦调用任何回调,循环将过期,从而导致ProcessClick(9)每个小部件的调用.
我觉得应该有一个简单的解决方案,但我被卡住了.
如何将回调函数绑定到GUI元素,每个GUI元素调用具有不同参数的函数而不将它们全部拼写出来?
i在循环期间由您的代理捕获.您需要将其值复制到循环中的局部变量以使其工作:
Widget widget ;
foreach (int i in new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } )
{
# Assign element i to widget
int index = i;
widget.Click += () => {ProcessClick(index) ;} ;
}
Run Code Online (Sandbox Code Playgroud)
有关变量捕获的更多信息可以在这里和Eric Lipper的博客上找到.对于后者,您还将找到有关C#团队在C#5中进行的重大更改的信息,其中变量逻辑上位于循环内(如DavidG所述).
| 归档时间: |
|
| 查看次数: |
665 次 |
| 最近记录: |