0
   private void button1_Click(object sender, RoutedEventArgs e)
    {
        new Thread(delegate() { doTest(); }).Start();
    }

当主窗口中包含 doTest() 时,如下所示,我的文本框正在从线程更新,我可以看到文本框值发生变化(因此从线程更新值正在工作。

   public void doTest()
        {
            int count = 20;
            while (count < 30)
            {
                 Dispatcher.Invoke(new Action(() => txtBoxLog.Text = count.ToString()), null);
                count++;
                Thread.Sleep(500);
            }
        }

但是,如果我删除上面的代码并创建单独的类,放置在主窗口类之外,从线程更新我的文本框失败并且我没有收到任何错误但根本没有改变它的值,我使用调度程序从线程更新不是更新 .

从 doTest() 类访问主窗口我创建了内部静态主 winodwo calss tw

internal static MainWindow tw;

现在我的 doTest() 方法在 clsTest.cs 文件中有以下代码

internal class clsTest
{
    public clsTest() { }

    public void doTest()
    {
        int count = 20;
        while (count < 30)
        {
            MainWindow.tw.Dispatcher.Invoke(
             new Action(() => MainWindow.tw.txtLog.Text = count.ToString()), DispatcherPriority.Background, null);

            count++;
            Thread.Sleep(500);
        }
    }
}

请帮助我确定我在这里出错的地方..

4

3 回答 3

1

您发布的内容没有任何明显错误。它们对我来说看起来不错,我通过在示例应用程序中运行您的代码片段进行了仔细检查。我猜想这与您如何初始化未显示的静态“tw” MainWindow 实例有关。

编辑:好的,您不应该像您正在做的那样显式地创建一个新的 MainWindow 实例,因为 WPF 会自动为您创建一个。相反,您应该将该静态实例设置为指向默认实例,例如在 MainWindow 类的构造函数中:

internal static MainWindow tw;

public MainWindow()
{
    InitializeComponent();
    tw = this;
}
于 2012-09-10T05:32:05.417 回答
0

帮助我确定我哪里出错了

这是您使用调度程序而不是仅绑定.Text

于 2012-09-10T01:36:08.027 回答
0

你不需要初始化twastw = this而不是tw = new MainWindow()吗?

于 2012-09-10T20:15:01.167 回答