我正在尝试重用 UserControl 并借用一些跟踪进度的逻辑。我会尝试简化事情。MyWindow.xaml 包含一个 MyUserControl。MyUserControl 有自己的进度指示器(正在格式化...,正在复制文件...等),我想在 MyWindow 表单的某个地方反映这个进度。但是,用户控件有一些我不太明白的逻辑。我已经阅读和阅读,但我仍然不了解调度程序。以下是更新进度的用户控件中的逻辑摘要。
this.Dispatcher.Invoke(DispatcherPriority.Input, (Action)(() =>
{
DAProgressIndicator = InfiniteProgress.AddNewInstanceToControl(StatusGrid, new SolidColorBrush(new Color() { A = 170, R = 128, G = 128, B = 128 }), string.Empty);
DAProgressIndicator.Message = MediaCardAdminRes.ActivatingCard;
ActivateInProgress = true;
}));
我认为我会很聪明,并向 MyUserControl 添加一个事件,该事件将在 ActivateInProgress 属性集逻辑中调用。
public bool ActivateInProgress
{
get
{
return _activateInProgress;
}
set
{
_activateInProgress = value;
if (ActivateInProgressHandler != null)
{
ActivateInProgressHandler(value);
}
}
}
我将 MyWindow 构造函数中的 ActivateInProgressHandler 设置为以下方法,该方法设置用于窗口自己的进度指示器的视图模型属性。
private void SetActivation(bool activateInProgress)
{
viewModel.ActivationInProgress = activateInProgress;
}
但是,窗口的进度指示器永远不会改变。所以,我确信 Dispatcher.Invoke 正在做一些我不理解的事情。如果我在 SetActivation 方法中放置一个消息框,线程会阻塞并且窗口的进度指示器会更新。我了解基本线程,但整个 Dispatcher 对我来说是新的。我错过了什么?
更新:它现在似乎正在工作。事实证明,进度更新得如此之快,以至于它从未显示在屏幕上。但是,我仍然想了解 Dispatcher.Invoke 完成的原因(这是我没有编写的现有代码)。为什么动作内容不符合 *.xaml.cs 代码的其余部分?