这种情况是使用C#WPF。我想在点击它后立即禁用一个按钮,以防止连续点击两次。我在OnClick_Event
中禁用了该按钮,但仍然可以点击。
部分来源如下。
private void Button_Click_UpdateBurndownChart(object sender, RoutedEventArgs e)
{
if(threadNotWorking)
{
updateButton.IsEnabled = false;
startWorkThread();
}
}
private void startWorkThread()
{
... ...
//after finish required process
updateButton.IsEnabled = true;
}
有没有办法实现这个目标?
答案 0 :(得分:2)
您可能想要使用调度程序,可能存在线程问题(回调函数在单独的线程上运行并尝试访问在另一个线程上运行的ui)。试试这个 。 。
updateButton.Dispatcher.BeginInvoke(
new ThreadStart(() => updateButton.IsEnabled = false),
System.Windows.Threading.DispatcherPriority.Input, null);
而不是
updateButton.IsEnabled = false;
答案 1 :(得分:0)
如果您改变了以下事件的顺序,会发生什么:
updateButton.IsEnabled = false;
startWorkThread();
要
startWorkThread();
updateButton.IsEnabled = false;
让我知道这是怎么回事。
答案 2 :(得分:0)
它看起来是你正在开始你的线程,然后在线程完成之前立即启用你的按钮。最好使用BackgroundWorker并在RunWorkerCompleted事件中启用Button。虽然您可以通过在流程结束时使用BeginInvoke启用按钮来执行类似操作。
public void doWork()
{
System.Threading.Thread.Sleep(10000); //Simulating your Process
Dispatcher.BeginInvoke(new System.Threading.ThreadStart(delegate() { updateButton.IsEnabled = true; }), System.Windows.Threading.DispatcherPriority.Background);
}
BackgroundWorker示例
using System.ComponentModel;
public partial class MainWindow : Window
{
BackgroundWorker bgw;
public MainWindow()
{
InitializeComponent();
bgw = new BackgroundWorker();
bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);
}
void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
updateButton.IsEnabled = true;
}
void bgw_DoWork(object sender, DoWorkEventArgs e)
{
System.Threading.Thread.Sleep(10000); //Simulating your work
}
private void startWorkThread()
{
bgw.RunWorkerAsync();
}
private void updateButton_Click(object sender, RoutedEventArgs e)
{
if (bgw.IsBusy != true)
{
updateButton.IsEnabled = false;
startWorkThread();
}
}
}