gpt4 book ai didi

c# - 禁用按钮触发 WPF 中的事件

转载 作者:太空狗 更新时间:2023-10-29 21:35:35 24 4
gpt4 key购买 nike

private void but_Click(object sender, RoutedEventArgs e)
{
(sender as Button).IsEnabled = false;
doSomeThing();//e.g run for more than 20 seconds
(sender as Button).IsEnabled = true;
}

当我第一次按下按钮时,它会禁用。然后启动 doSomeThing(),它包含 UI 代码或更新的一些 UI 变量。我的意思是,如果我在 doSomeThing() 进行时再次按下按钮,那么 but_Click 事件会在此按钮启用后再次触发。它维护事件触发队列,即我按下的 n 次。

那么,如何防止按钮被禁用时触发事件呢?请考虑在这种情况下“doSomething”包含绑定(bind)到代码的 UI 控件。所以在这种情况下我们不能运行后台线程。帮我解决问题。

最佳答案

似乎需要进行一些澄清......

  • 控件(例如按钮)已正确禁用。
  • 只要主线程正在处理原始点击事件,就不会处理后续事件 - 相反,它们会排队。
  • 一旦完成第一个点击事件,就会处理下一个排队的事件。
  • 此时,由于控件已经启用,排队的点击事件将再次触发事件处理程序。

有几种可能的解决方案,我认为@Amit 走在正确的轨道上——使用线程可能是最好的方法。

这是对我有用的简化版本:

private void Button1_Click(object sender, EventArgs e)
{
disableControls(); // e.g.- Button1.Enabled = false;

// run "doSomething" in a separate thread
new Thread(new ThreadStart(doSomething)).Start();
}

private void doSomething()
{
// do something... make sure it's thread-safe!!
// ...

enableControls(); // a thread safe enabling of relevant controls
}

为了很好地解释为什么不使用 Application.DoEvents()look here

有关控件状态的线程安全操作,请参阅: How to: Make Thread-Safe Calls to Windows Forms Controls

关于c# - 禁用按钮触发 WPF 中的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9527404/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com