在事件期间无法访问 WPF 按钮
WPF buttons aren't accessible during an event
我在创建的表单中启用和禁用按钮时遇到问题。
如果我从事件处理程序切换按钮的状态,它们会正常禁用。
private void btnBlock_Click(object sender, RoutedEventArgs e)
{
blockWizard();
}
private void blockWizard()
{
txtBackupName.IsEnabled = false;
txtSourceLocation.IsEnabled = false;
txtDestLocation.IsEnabled = false;
btnSourceBrowse.IsEnabled = false;
btnDestBrowse.IsEnabled = false;
chkRunJobNow.IsEnabled = false;
txtPassword.IsEnabled = false;
btnCreateBackup.IsEnabled = false;
}
如果我从一个方法中调用我的阻塞方法,它不起作用。
private void SomeEvent()
{
SomeOtherEvent();
blockWizard();
}
如能提供任何帮助来解释为什么会发生这种情况,我们将不胜感激。
我怀疑您的 SomeEvent
方法是从 UI 线程以外的线程执行的。如果是这种情况,则您无法从其他线程更新 UI。
您可以添加如下内容:
private delegate void blockWizardHandler();
private void blockWizard()
{
if (Dispatcher.CheckAccess())
{
// We are on the UI thread, update the button states
txtBackupName.IsEnabled = false;
txtSourceLocation.IsEnabled = false;
txtDestLocation.IsEnabled = false;
btnSourceBrowse.IsEnabled = false;
btnDestBrowse.IsEnabled = false;
chkRunJobNow.IsEnabled = false;
txtPassword.IsEnabled = false;
btnCreateBackup.IsEnabled = false;
}
else
{
// We are not on the UI thread, invoke delegate to re-run this method on UI thread
Dispatcher.Invoke(new blockWizardHandler(blockWizard), null);
}
}
我在创建的表单中启用和禁用按钮时遇到问题。
如果我从事件处理程序切换按钮的状态,它们会正常禁用。
private void btnBlock_Click(object sender, RoutedEventArgs e)
{
blockWizard();
}
private void blockWizard()
{
txtBackupName.IsEnabled = false;
txtSourceLocation.IsEnabled = false;
txtDestLocation.IsEnabled = false;
btnSourceBrowse.IsEnabled = false;
btnDestBrowse.IsEnabled = false;
chkRunJobNow.IsEnabled = false;
txtPassword.IsEnabled = false;
btnCreateBackup.IsEnabled = false;
}
如果我从一个方法中调用我的阻塞方法,它不起作用。
private void SomeEvent()
{
SomeOtherEvent();
blockWizard();
}
如能提供任何帮助来解释为什么会发生这种情况,我们将不胜感激。
我怀疑您的 SomeEvent
方法是从 UI 线程以外的线程执行的。如果是这种情况,则您无法从其他线程更新 UI。
您可以添加如下内容:
private delegate void blockWizardHandler();
private void blockWizard()
{
if (Dispatcher.CheckAccess())
{
// We are on the UI thread, update the button states
txtBackupName.IsEnabled = false;
txtSourceLocation.IsEnabled = false;
txtDestLocation.IsEnabled = false;
btnSourceBrowse.IsEnabled = false;
btnDestBrowse.IsEnabled = false;
chkRunJobNow.IsEnabled = false;
txtPassword.IsEnabled = false;
btnCreateBackup.IsEnabled = false;
}
else
{
// We are not on the UI thread, invoke delegate to re-run this method on UI thread
Dispatcher.Invoke(new blockWizardHandler(blockWizard), null);
}
}