【问题标题】:WPF buttons aren't accessible during an event事件期间无法访问 WPF 按钮
【发布时间】:2015-04-23 05:08:19
【问题描述】:

在我创建的表单中启用和禁用按钮时遇到问题。

如果我从事件处理程序切换按钮的状态,它们会正常禁用。

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 方法在哪里?在同一个班级,还是在另一个班级?
  • 如果您注释掉 SomeOtherEvent();blockWizard(); 会按预期运行吗?
  • 需要模式说明和代码。全面了解您的问题

标签: wpf events button


【解决方案1】:

我怀疑您的 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);
   }
}

【讨论】:

  • 感谢您的帮助!这正是问题所在,我只是希望 Visual Studio 更冗长一些,而不是像一切正常一样调试我的所有代码。
  • 不用担心,很高兴它有所帮助。以供将来参考,当这种情况发生时,您应该看到 InvalidOperationException 打印到 Output 窗口
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-03
  • 2014-02-17
  • 1970-01-01
  • 1970-01-01
  • 2011-02-14
  • 1970-01-01
相关资源
最近更新 更多