Если вы действительно хотите быструю и грязную реализацию и не заботитесь о поддержке продукта в будущем или о пользовательском опыте, вы можете просто добавить ссылку на System.Windows.Forms и вызватьSystem.Windows.Forms.Application.DoEvents()
:
for (int i = 0; i < 50; i++)
{
System.Threading.Thread.Sleep(100);
MyTextBlock.Text = i.ToString();
System.Windows.Forms.Application.DoEvents();
}
Недостатком является то, что это действительно очень плохо .Вы собираетесь заблокировать пользовательский интерфейс во время Thread.Sleep (), который раздражает пользователя, и вы можете получить непредсказуемые результаты в зависимости от сложности программы (я видел одно приложение, в котором два метода выполнялись наПоток пользовательского интерфейса, каждый из которых вызывает DoEvents () несколько раз ...).
Вот как это должно быть сделано:
- В любое время, когда ваше приложение должнождать, пока что-то произойдет (например, чтение с диска, вызов веб-службы или Sleep ()), это должно происходить в отдельном потоке.
- Не следует устанавливать TextBlock.Text вручную - привязать его ксвойство и реализация INotifyPropertyChanged.
Вот пример, демонстрирующий запрашиваемую вами функциональность.Написание занимает всего несколько секунд, и с ним гораздо проще работать - и он не блокирует интерфейс.
Xaml:
<StackPanel>
<TextBlock Name="MyTextBlock" Text="{Binding Path=MyValue}"></TextBlock>
<Button Click="Button_Click">OK</Button>
</StackPanel>
CodeBehind:
public partial class MainWindow : Window, INotifyPropertyChanged
{
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Task.Factory.StartNew(() =>
{
for (int i = 0; i < 50; i++)
{
System.Threading.Thread.Sleep(100);
MyValue = i.ToString();
}
});
}
private string myValue;
public string MyValue
{
get { return myValue; }
set
{
myValue = value;
RaisePropertyChanged("MyValue");
}
}
private void RaisePropertyChanged(string propName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
public event PropertyChangedEventHandler PropertyChanged;
}
Код может показаться немного сложным, но это краеугольный камень WPF, и он идет вместе с небольшой практикой - его стоит изучить.