У меня есть рабочий и индикатор выполнения. индикатор выполнения находится в представлении, и рабочий находится в модели. Я хочу показать индикатор выполнения пользователю, чтобы они знали, сколько времени им нужно ждать. для всех результатов, чтобы закончить заполнение.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 секунды.
Любые идеи?
Вызов HideProgressBar асинхронно с помощью Dispatcher.BeginInvoke. Это даст возможность окна перерисовать себя, так что 'Thread.Sleep (3000)' выполняется, когда индикатор выполнения отображается в состоянии филамента. 'Dispatcher.BeginInvoke (new Action (() => HideProgressBar()));' –
Я предполагаю, что вы говорите об использовании диспетчера в общедоступном void ProgressBar_WMI_ValueChanged (отправитель объекта, RoutedEventArgs e) Метод, я обновил код и все еще Я сталкиваюсь с проблемами. –