2017-08-05 62 views
0

我創建了一個TreeViewItem,它裏面有一個ProgressBar。TreeViewItem中的ProgressBar

<DataTemplate> 
     <StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Height="35" MinWidth="100"> 
     <CheckBox Name="chk" IsChecked="True" Margin="2" Tag="{Binding}" Style="{DynamicResource myCheckBoxStyle}" /> 
     <TextBlock Text="{Binding}" Padding="0 10 0 10" Width="100" /> 
     <ProgressBar x:Name="tvProgressBar" HorizontalAlignment="Right" Width="300" Height="20" Foreground="#FF089ACE" /> 
     </StackPanel> 
</DataTemplate> 

但我似乎無法更新進度的價值,我可以通過做

ProgressBar pb = (System.Windows.Controls.ProgressBar)(tv.HeaderTemplate.LoadContent() as StackPanel).FindName("tvProgressBar"); 

找到進度條但當我更新進度條的值的UI不更新。如果我在TreeView之外創建一個ProgressBar,按預期進行更新,這似乎是我要麼訪問TreeViewItem中嵌入ProgressBar的方式,要麼是它需要更新的方式。

+0

嘗試與'MinValue'和默認值'MaxValue'性能可能設置爲'MINVALUE = 1','的MaxValue = 100'。無法準確記得屬性名稱是'MinValue'或'MinimumValue'。 –

+0

最小值和最大值並不相同,因爲反正 –

+0

只有兩個原因可能導致您的進度條不能直觀更新:** 1)**實際上並非實際更改'值'或** 2) **您正在嘗試顯示正在UI線程中執行的操作的進度。使用'ProgressBar'的正確方法是在後臺線程中運行長時間運行的操作(例如'Task.Run()'),並讓該操作更新一個_view model_屬性,該屬性綁定到ProgressBar.Value財產。你沒有發佈可靠地再現問題的好的[mcve],所以不可能真正回答問題。 –

回答

0

如何更新值?你有「等待」光標嗎?如果是這樣的話,您可能需要使用工作線程運行UI,以便進度條實際更新並且不僅僅是從0到100.

查看進度條控件上的這些鏈接:123

Essentialy,試試這個:

private readonly BackgroundWorker worker = new BackgroundWorker { WorkerReportsProgress = true }; 

public MainWindow() 
{ 
    InitializeComponent(); 

    worker.DoWork += worker_DoWork; 
    worker.ProgressChanged += worker_ProgressChanged; 
} 

private void worker_DoWork(object sender, DoWorkEventArgs doWorkEventArgs) 
{ 
    // Do some long process, break it up into a loop so you can periodically 
    // call worker.ReportProgress() 

    worker.ReportProgress(i); // Pass back some meaningful value 
} 

private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    prgBar.Value = Math.Min(e.ProgressPercentage, 100); 
} 
+0

UI是響應式的,不會凍結,進度條只是永遠不會更新。我試過在另一個線程使用dispatcher.BeingInvoke但仍然得到同樣的問題。 –

+0

我試着在TreeViewItem模板之外添加一個進度條,並且如預期的那樣進行更新,所以它在模板中處理它。 –