如何通过循环更新wpf文本块的文本?

时间:2011-08-19 04:52:33

标签: wpf text textblock

我有一个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 个答案:

答案 0 :(得分:1)

您需要使用MessageListener和DispatcherHelper类来实现您的逻辑,以便在代码项目中的这个初始屏幕示例中实现的某个时间间隔更新文本:

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

答案 1 :(得分:1)

要通知更改,您需要实施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);
    } 

您可以在Implement Application.DoEvents in WPF

中查看更多信息

答案 2 :(得分:0)

您的文本块未更新的原因是您阻止了调度程序。

让循环出现在新线程上,并要求调度员更新文本块。

 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);
    }