我想重用一個UserControl,並借用一些邏輯來跟蹤進度。我會盡量簡化一些事情。 MyWindow.xaml包含一個MyUserControl。 MyUserControl有其自己的進度指示器(正在格式化...,複製文件...等),我想在MyWindow窗體中的某處反映這一進展。但是,用戶控件有一些我不太明白的邏輯。我已閱讀並閱讀,但我仍然不理解Dispatcher。以下是用戶控件中更新進度的邏輯的摘要。Dispatcher.Invoke爲什麼不觸發UI更新?
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代碼的其餘部分完成操作內容?
如何更新窗口中的進度條?然而,它必須在一個單獨的線程中完成,然後使用調度程序。 – Amsakanna 2010-06-15 06:03:27