WPF SelectionChanged事件在选项卡更改之前执行操作

3

我的WPF应用程序中有一个SelectionChanged事件。当选项卡改变时,我希望执行某些操作,但首先我希望选项卡在动作开始之前进行视觉更改。我正在使用后台工作者来完成任务。我的代码如下:

    private void Tab_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (tab1.IsSelected)
        {
            //this line is not working
            tabcontrol.SelectedIndex = 1;
            wNetTest = new BackgroundWorker();
            wNetTest.DoWork += new DoWorkEventHandler(worker_DoWork);
            wNetTest.RunWorkerCompleted += worker_RunWorkerCompleted;
            wNetTest.WorkerReportsProgress = true;
            wNetTest.WorkerSupportsCancellation = true;
            wNetTest.RunWorkerAsync();

        }
    }

    void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        //do the job
    }

问题在于当我更改选项卡时,选项卡直到操作完成后才会更改。我希望在开始DoWork操作之前选项卡就能够更改。 - user3719173
那你为什么在 Backgroundworker 中启动了一个新线程呢? - Nikhil Agrawal
我想在主线程中添加进度条,我不希望主线程的主要任务被卡住。 - user3719173
1
如果您确定要执行的代码仅在用户查看视图并使用鼠标或键盘更改选项卡时发生,则请使用Dispatcher.BeginInvoke,并将操作推迟到调度程序不再使用,这意味着优先级设置为后台,确保完成所有绘图并准备好调度程序以继续执行您的操作。 - dev hedgehog
1个回答

1
你的问题在于你的代码是同步运行的。因此,在你看到TabItem更改之前,你Tab_SelectionChanged事件处理程序的每一行都会运行。要解决这个问题,你只需要异步运行长时间运行的进程。其中最简单的方法之一是这样的:
private void Tab_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (tab1.IsSelected)
    {
        //this line is not working
        tabcontrol.SelectedIndex = 1;
        Task.Factory.StartNew(() => LongRunningMethod(parameter));

    }
}

private void LongRunningMethod(object parameter)
{
    // perform long running process here
}

parameter输入参数是可选的...如果您不需要它,请将其删除。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接