2017-08-05 1 views
0

J'ai créé un TreeViewItem qui contient un ProgressBar.ProgressBar dans TreeViewItem

<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> 

Mais je ne peux pas sembler mettre à jour la valeur de la barre de progression, je peux trouver la barre de progression en faisant

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

Mais quand je mets à jour la valeur de la barre de progression de l'interface utilisateur est pas mis à jour . Si je crée un ProgressBar en dehors de TreeView, les mises à jour sont comme prévu, donc cela semble être la façon dont j'accède au ProgressBar incorporé dans le TreeViewItem ou à la manière dont il doit être mis à jour.

+0

essayez avec des valeurs par défaut des propriétés '' MinValue' et MaxValue' réglage peut-être 'MinValue = 1',' MaxValue = 100'. Impossible de rappeler exactement le nom de la propriété est 'MinValue' ou 'MinimumValue'. –

+0

Les valeurs minimum et maximum ne font pas de différence, merci en tout cas –

+0

Il y a seulement deux raisons pour que votre barre de progression ne soit pas mise à jour visuellement: ** 1) ** vous n'êtes pas réellement en train de changer la valeur, ou ** 2) ** vous tentez d'afficher la progression d'une opération en cours d'exécution dans le thread d'interface utilisateur. La façon correcte d'utiliser 'ProgressBar' est d'exécuter votre opération de longue durée dans un thread d'arrière-plan (par exemple' Task.Run() '), et de mettre cette opération à jour une propriété _view model_, qui est liée à' ProgressBar.Value 'propriété. Vous n'avez pas envoyé un bon [mcve] qui reproduit fidèlement le problème, il n'est donc pas possible de répondre réellement à la question. –

Répondre

0

Comment mettez-vous à jour la valeur? Avez-vous le curseur "wait"? Si oui, vous devrez probablement utiliser un thread de travail pour exécuter l'interface utilisateur afin que la barre de progression se mette à jour et ne passe pas de 0 à 100.

Consultez ces liens dans la barre de progression: 1, 2 , 3

essentialy, essayez ceci:

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

L'interface utilisateur est réactive et ne gèle pas, la barre de progression ne se met jamais à jour. J'ai essayé dans un autre thread en utilisant un répartiteur.BeingInvoke mais toujours le même problème. –

+0

J'ai essayé d'ajouter une barre de progression en dehors du modèle TreeViewItem et elle se met à jour comme prévu, ce qui fait que c'est quelque chose à faire dans le modèle. –