2014-01-14 3 views
0

У меня есть рабочий и индикатор выполнения. индикатор выполнения находится в представлении, и рабочий находится в модели. Я хочу показать индикатор выполнения пользователю, чтобы они знали, сколько времени им нужно ждать. для всех результатов, чтобы закончить заполнение.Progress Bar не заполняется

Рабочего поток выглядит следующим образом

Модель

ManagementObjectSearcher MetaClasses = new ManagementObjectSearcher(CurrentScope, new SelectQuery("SELECT * FROM meta_class")); 
int index = 0; 
int Total = MetaClasses.Get().Count; 
foreach (ManagementObject Metaclass in MetaClasses.Get()) 
{ 
    try 
    { 
     index++; 
     BGW.ReportProgress((index * 100)/Total, Metaclass["__CLASS"].ToString()); 
    } 
    catch { } 
    Thread.Sleep(100); 
} 

работник отправляет информацию методы ProgressUpdated, я сделал это так, пользовательский интерфейс обновляется с Availible данных для конечного пользователя.

Модель

public void Workers_Changed(object sender, ProgressChangedEventArgs e) 
{ 
    Progress = e.ProgressPercentage; 
    switch (TaskToRun) 
    { 
     case "NameSpace": 
      { 
       BaseClasses.Add(e.UserState.ToString()); 
       if (Progress == 100) { Thread.Sleep(200); } 
       break; 
      } 
     case "Class": 
      { 
       return; 
      } 
    } 
} 

снова работает отлично. Моя строка выполнения Значение также привязано.

XAML

<ProgressBar Height="20" Name="ProgressBar_WMI" 
      Value="{Binding Progress,Mode=OneWay}" 
      DockPanel.Dock="Top" 
      Minimum="1" 
      Maximum="100" Foreground="Red" ValueChanged="ProgressBar_WMI_ValueChanged" /> 

Проблема: когда прогрессбар попадает около 95% она не показывает, как завершить в UI потоке

View (Xaml.CS)

public void HideProgressBar() 
{ 
    Thread.Sleep(3000); 
    ProgressBar_WMI.Visibility = Visibility.Collapsed; 
} 

public void ProgressBar_WMI_ValueChanged(object sender, RoutedEventArgs e) 
{ 
    if (ProgressBar_WMI.Value == ProgressBar_WMI.Maximum) 
    { 
     ProgressBar_WMI.Foreground = Brushes.Green; 
     HideProgressBar(); 
    } 
    else { 
     ProgressBar_WMI.Foreground = Brushes.Red; 
     ProgressBar_WMI.Visibility = Visibility.Visible; 
    } 
} 

Моя идея состоит в том, чтобы удар попал на 100% и стал зеленым, чтобы показать, что его завершено и исчезновение/сбой через 3 секунды.

Любые идеи?

+0

Вызов HideProgressBar асинхронно с помощью Dispatcher.BeginInvoke. Это даст возможность окна перерисовать себя, так что 'Thread.Sleep (3000)' выполняется, когда индикатор выполнения отображается в состоянии филамента. 'Dispatcher.BeginInvoke (new Action (() => HideProgressBar()));' –

+0

Я предполагаю, что вы говорите об использовании диспетчера в общедоступном void ProgressBar_WMI_ValueChanged (отправитель объекта, RoutedEventArgs e) Метод, я обновил код и все еще Я сталкиваюсь с проблемами. –

ответ

0

Я вижу две возможные причины для вашего ProgressBar не достигая 100%. Первый - это просто потому, что вы можете скрыть его, как только он достигнет этого момента, и поэтому вы никогда не делаете на самом деле.

Другой возможно причина заключается в том, что этот расчет никогда не достигает максимальной предельной величины:

BGW.ReportProgress((index * 100)/Total, Metaclass["__CLASS"].ToString()); 

Только вы можете проверить это, но вы может потерять некоторую точность фактического расчета по используя int S здесь ... Я я известно, что метод ReportProgress принимает int

+0

if (ProgressBar_WMI.Value == ProgressBar_WMI.Maximum), не позволяет выполнить указанное действие до достижения максимума. используя точки останова, показывает, что значение = максимум. –