Как обновить текст текстового блока wpf через цикл? - PullRequest
1 голос
/ 19 августа 2011

У меня есть приложение wpf, и в этом приложении у меня есть кнопка и текстовый блок.Я нажал кнопку и в автоответчике я сделал простой цикл.В этом цикле я ждал 2 секунды, а после ожидания я обновил текст текстового блока, но кажется, что текстовый блок не обновляется вместе с текстом.Скорее он обновляется один раз (в последний раз с первым элементом tex).Может кто-нибудь знает .. как обновить текстовый блок в цикле ....

public partial class MainWindow : Window
{
    List<String> list;

    public MainWindow()
    {
        InitializeComponent();
        LoadList();
    }



    private void LoadList()
    {
        list = new List<string>();
        list.Clear();
        list.Add("Chisty");
        list.Add("Forkan");
        list.Add("Farooq");
    }



    private void BtnClickHandler(object sender, RoutedEventArgs e)
    {
        for (int i = 0; i < 3; i++)
        {                
            System.Threading.Thread.Sleep(5000);  // wait for 5 second
            textBlock1.Text = list[i].ToString(); // assign a new text to the textblock
            System.Console.WriteLine(list[i].ToString());
        }
    }
}

Ответы [ 3 ]

1 голос
/ 19 августа 2011

Чтобы уведомить об изменениях, вам нужно реализовать Dispatcher
Попробуйте это ...

private void BtnClickHandler(object sender, RoutedEventArgs e)
    {
        for (int i = 0; i < 3; i++)
        {                
            System.Threading.Thread.Sleep(5000);  // wait for 5 second
            textBlock1.Text = list[i].ToString();
            DoEvents();
            System.Console.WriteLine(list[i].ToString());
        }
    }



  public void DoEvents()
    {
        DispatcherFrame frame = new DispatcherFrame(true);
        Dispatcher.CurrentDispatcher.BeginInvoke
        (
        DispatcherPriority.Background,
        (SendOrPostCallback)delegate(object arg)
        {
            var f = arg as DispatcherFrame;
            f.Continue = false;
        },
        frame
        );
        Dispatcher.PushFrame(frame);
    } 

Дополнительную информацию можно найти в Реализация приложения. События в WPF

1 голос
/ 19 августа 2011

Вам необходимо реализовать свою логику, используя классы MessageListener и DispatcherHelper для обновления текста через некоторый интервал, как это реализовано в этом примере заставки в проекте кода:

http://www.codeproject.com/KB/WPF/WPFsplashscreen.aspx

0 голосов
/ 19 августа 2011

Причина, по которой вы не обновляете текстовый блок, заключается в том, что вы блокируете диспетчер.

Пусть цикл возникнет в новом потоке и попросит диспетчера обновить текстовый блок.

 private delegate void UpdateTextBox();

 private void BtnClickHandler(object sender, RoutedEventArgs e)
    {
        string text;
        UpdateTextBox updateTextBox = () => textBlock1.Text = text;
        Action a = (() =>
                        {
                            for (int i = 0; i < 3; i++)
                            {
                                System.Threading.Thread.Sleep(500); // wait for 5 second
                                text = list[i].ToString();
                                textBlock1.Dispatcher.Invoke(updateTextBox); // assign a new text to the textblock
                                System.Console.WriteLine(list[i].ToString());
                            }
                        });
        a.BeginInvoke(null, null);
    }
...