等待UI重新渲染完成

时间:2014-03-13 17:26:58

标签: wpf rendering backgroundworker

我实际上在这里遇到了两个类似的问题,没有运气在网上找到任何东西。

问题1:使用BackgroundWorker,我正在使用%done更新UI,但我使用的是UserState,因为我想报告百分比的百分比。问题是,根据输入的不同,有时更新很少发生(每隔几秒钟发生一次),其他时间非常快(触发小数百分比每秒更新一次)。在后一种情况下,我得到一个堆栈溢出(没有双关语意)的问题。我猜测ProgressChanged事件的调用太多了。这是现在的原型代码,我在progressChanged事件中直接更新TextBlock而不是使用ViewModels,但我稍后会。不确定这可能是问题所在。有没有办法允许这个进度改变的事件被调用它需要的频率,但是说: if(!mytextblock.IsRendering())   mytextblock.text = newPercent;

这样它就会在完成绘制最后一个数字时更新。如果百分比被跳过,那没关系。

问题2:这是一个个人项目,我正在进行屏幕捕获,以某种方式更改它,然后在wpf程序中显示已更改的图像,并连续重复。有没有办法说:   GrabScreen   EditImage   UpdateUI   WaitForUIToRender //< -------我该怎么做?   重复

谢谢

1 个答案:

答案 0 :(得分:0)

 public class TimedAction 
{
    public static void ExecuteWithDelay(Action action, TimeSpan delay)
    {
        var timer = new DispatcherTimer();
        timer.Interval = delay;
        timer.Tag = action;
        timer.Tick += timer_Tick;
        timer.Start();
    }

    static void timer_Tick(object sender, EventArgs e)
    {
        var timer = (DispatcherTimer)sender;
        var action = (Action)timer.Tag;

        action.Invoke();
        timer.Stop();
    }

    public static void ExecuteAfterRendering(Action action)
    {
        ExecuteAfterFrames(action, 3);
    }

    public static void ExecuteAfterFrames(Action action, int frames)
    {
        var timedAction = new TimedAction();
        timedAction._currentAction = action;
        timedAction._framesToWait = frames;
    }

    private Action _currentAction;
    private int _framesToWait;
    private int _currentFrame = 0;
    private TimedAction()
    {
        CompositionTarget.Rendering += CompositionTarget_Rendering;
    }

    private void Dispose()
    {
        CompositionTarget.Rendering -= CompositionTarget_Rendering;
    }

    void CompositionTarget_Rendering(object sender, EventArgs e)
    {
        _currentFrame++;
        if (_currentFrame == _framesToWait)
        {
            _currentAction.Invoke();
            Dispose();
        }
    }

}