Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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进度条未正确更新_C#_.net_Wpf_Xaml - Fatal编程技术网

C# WPF进度条未正确更新

C# WPF进度条未正确更新,c#,.net,wpf,xaml,C#,.net,Wpf,Xaml,我有一个窗口,显示一些要做的活动,每个活动都有一个进度条,在活动需要完成的时间过去时,进度条必须相应地进行。 我使用了一个调度计时器,但我在逻辑上遇到了困难,所以我会有奇怪的行为,比如酒吧被正确地填满了4次,然后总是立即达到100% 这是我控制的代码: private void InitializeDispatcherTimer() { var dispatcherTimer = new System.Windows.Threading.Dispatch

我有一个窗口,显示一些要做的活动,每个活动都有一个进度条,在活动需要完成的时间过去时,进度条必须相应地进行。 我使用了一个调度计时器,但我在逻辑上遇到了困难,所以我会有奇怪的行为,比如酒吧被正确地填满了4次,然后总是立即达到100%

这是我控制的代码:

 private void InitializeDispatcherTimer()
        {
            var dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
            dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
            dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 100);

            dispatcherTimer.Start();
            WhenTimerStarted = DateTime.Now;
        }

        private void dispatcherTimer_Tick(object sender, EventArgs e)
        {
            foreach (var activity in ViewModel.Activities)
            {
                var mySeconds = DateTime.Now.Subtract(WhenTimerStarted).TotalSeconds;

                if (activity.duration != null)
                {
                    var myDurationInSeconds = (Double)activity.Duration.Value.TotalSeconds;
                    activity.Progress = (mySeconds * 100) / myDurationInSeconds;

                }

                if (activity.Progress == 100)
                {
                    WhenTimerStarted = DateTime.Now;
                }


            }
        }
这是xaml文件中的条形图:

<ProgressBar x:Name="progress" Grid.Row="3" Value="{Binding Path=Progress, UpdateSourceTrigger=PropertyChanged}" Maximum="100"/>

Activities是一个由4个ActivityViewModel组成的数组,因此每个activity都是一个视图模型。 当一个活动完成时,在另一个类中,我有一个名为activity_Done()的事件,在该事件中我将activity.Progress设置为零,因此栏被清空

我想问题出在变量mySeconds上,因为随着计时器的运行和时间的流逝,它变得越来越大,所以除以myDurationInSeconds会得到很大的结果(?),我不知道在哪里重置它,或者我混淆了Dispatcher.Interval的用途,它与每个活动的持续时间和剩余时间有关。 或者我只需要重新思考一下滴答的逻辑,在这种情况下,我很乐意接受一些提示


另外,我需要指出的是,在我停止程序或关闭应用程序之前,程序需要完成大量活动。

请注意,在值绑定上设置
UpdateSourceTrigger=PropertyChanged
。它只对双向或单向源绑定产生影响。谢谢,它将解决这个问题。此外,还不清楚您的逻辑应该如何工作。当任何活动达到100%时,您似乎正在重新设置何时开始。此外,将其与100进行比较似乎很危险。如果(activity.Progress>=100),则更好地检查
。关键是,每次活动完成时,它都会被消除,并出现一个新的活动并开始,因此必须将条设置回0,并以新的持续时间进行进度(持续时间是随机的,当活动被推到队列中时生成)