Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF SelectionChanged事件在更改选项卡之前执行操作_C#_Wpf - Fatal编程技术网

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

C# WPF SelectionChanged事件在更改选项卡之前执行操作,c#,wpf,C#,Wpf,我已在WPF应用程序中选择更改事件。我希望在选项卡更改为执行某些操作时,但首先我希望选项卡在操作开始之前进行可视化更改。我正在使用后台工作人员来做这项工作。我的代码是: private void Tab_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (tab1.IsSelected) { //this line is not working

我已在WPF应用程序中选择更改事件。我希望在选项卡更改为执行某些操作时,但首先我希望选项卡在操作开始之前进行可视化更改。我正在使用后台工作人员来做这项工作。我的代码是:

    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
    }

您的问题是代码正在同步运行。因此,
Tab\u SelectionChanged
事件处理程序的每一行都将在看到
TabItem
更改之前运行。要解决此问题,您只需要异步运行长时间运行的流程。最简单的方法之一是:

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
}

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

问题是,当我更改选项卡时,直到操作完成,选项卡才会更改。我希望在DoWork中的操作启动之前更改选项卡。那么为什么在Backgroundworker中启动新线程?我希望将进度条添加到主线程。我不希望主作业卡在主线程上。如果您确定只有当用户使用鼠标或键盘,然后使用Dispatcher.BeginInvoke并将操作推迟到Dispatcher未使用意味着优先级设置为后台,以确保完成所有绘图,Dispatcher准备好继续您的操作