【问题标题】:WPF TabControl tab changes not refreshedWPF TabControl 选项卡更改未刷新
【发布时间】:2013-03-21 13:43:37
【问题描述】:

我有一个WPF TabControl 和两个TabItems。我正在尝试更改Button click 事件后面代码上的选定选项卡并执行一些其他代码。在这个例子中:

private void Button_Click(object sender, RoutedEventArgs e)
{
    ConvertDataTabControl.SelectedIndex = 1;
    System.Threading.Thread.Sleep(2000);
    ...
}

我希望 UI 会刷新并从 Tab 0 移动到 Tab 1,然后才执行 Sleep 方法,但 UI 仅在 Button_Click 完成执行后才会刷新。我尝试拨打InvalidateVisual,但它不起作用。

有没有办法在执行Sleep之前强制刷新UI?

【问题讨论】:

  • 在 WPF 中,很多东西都被延迟了,尤其是在输入、视图创建和渲染方面。最好避免这样的代码,并对情况“做出反应”或使用适当的状态机之类的方法。如果您想在页面更改时执行某些操作,请对该特定页面的 Loaded 事件做出反应。

标签: c# wpf button tabcontrol thread-sleep


【解决方案1】:

默认情况下,您的代码在 UI 线程上运行,因此在线程完成执行之前,不能在 UI 线程上执行任何其他操作(例如更新布局)。

有很多方法可以在代码完成执行之前释放对 UI 线程的控制,但我发现最简单的方法是使用 Task Parallel Library 中的 Task,它可用于在单独的线程上运行代码。

例如,

Task.Factory.StartNew(() =>
{
    Thread.Sleep(2000);

    // Other code here
});

需要注意的是,UI 对象只能在 UI 线程上修改,因此如果您的“此处的其他代码”更新了 UI 对象,您可能希望使用 Dispatcher 在 UI 线程上执行代码,像这样:

Dispatcher.BeginInvoke(() =>
{
    // Code to update the UI
});

【讨论】:

【解决方案2】:

试试

Dispatcher.BeginInvoke(()=>
{
    ConvertDataTabControl.SelectedIndex = 1;
});

【讨论】:

  • 这到底有什么帮助?调度睡眠?调度选定的索引?这样一来,它只会进一步延迟执行。
  • 你不应该调用睡眠!在你抱怨之前检查 msdn BeginInvoke。
  • 我没有抱怨我只是觉得你的回答有点缺乏信息。当然你不应该这样做,你知道,我知道但也许不是 OP。
  • 你能解释一下为什么你会调用 sleep() 吗?
  • 我仅将其用作示例。我想移动到第二个选项卡,查看该选项卡并执行之后的代码。
【解决方案3】:

问题是你在 UI 线程上做你的工作(睡眠)。您可以使用任务/后台工作人员/等在其他线程中完成工作,然后将 ui 更改设置回 UI 线程:

private void Button_Click(object sender, RoutedEventArgs e)
{
    Dispatcher callback = Dispatcher.CurrentDispatcher;
    ThreadPool.QueueUserWorkItem(new WaitCallback((o) =>
    {
         //Do some work
         System.Threading.Thread.Sleep(2000);

         //callbackk to ui thread to do ui work. You can also use BeginInvoke...
         callback.Invoke(new Action(() => {ConvertDataTabControl.SelectedIndex = 1;}));

         //Do some more work
         System.Threading.Thread.Sleep(2000);
         ...
    }
}

这只是一个例子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 2014-07-14
    • 2011-04-04
    相关资源
    最近更新 更多