我实际上在这里遇到了两个类似的问题,没有运气在网上找到任何东西。
问题1:使用BackgroundWorker,我正在使用%done更新UI,但我使用的是UserState,因为我想报告百分比的百分比。问题是,根据输入的不同,有时更新很少发生(每隔几秒钟发生一次),其他时间非常快(触发小数百分比每秒更新一次)。在后一种情况下,我得到一个堆栈溢出(没有双关语意)的问题。我猜测ProgressChanged事件的调用太多了。这是现在的原型代码,我在progressChanged事件中直接更新TextBlock而不是使用ViewModels,但我稍后会。不确定这可能是问题所在。有没有办法允许这个进度改变的事件被调用它需要的频率,但是说: if(!mytextblock.IsRendering()) mytextblock.text = newPercent;
这样它就会在完成绘制最后一个数字时更新。如果百分比被跳过,那没关系。
问题2:这是一个个人项目,我正在进行屏幕捕获,以某种方式更改它,然后在wpf程序中显示已更改的图像,并连续重复。有没有办法说: GrabScreen EditImage UpdateUI WaitForUIToRender //< -------我该怎么做? 重复
谢谢
答案 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();
}
}
}