gpt4 book ai didi

wpf - 如何刷新循环内设置的可视控件属性 (TextBlock.text)?

转载 作者:行者123 更新时间:2023-12-04 00:04:14 25 4
gpt4 key购买 nike

在每次循环迭代中,我想直观地更新文本 block 的文本。我的问题是 WPF 窗口或控件在循环完成之前不会在视觉上刷新。

for (int i = 0; i < 50; i++)
{
System.Threading.Thread.Sleep(100);
myTextBlock.Text = i.ToString();
}

在 VB6 中,我会调用 DoEvents()control.Refresh .目前我只想要一个类似于 DoEvents() 的快速而肮脏的解决方案。 ,但我也想知道替代方案或“正确”的方式来做到这一点。我可以添加一个简单的绑定(bind)语句吗?语法是什么?
提前致谢。

最佳答案

如果您真的想要快速而肮脏的实现并且不关心将来维护产品或用户体验,您可以添加对 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() 期间锁定 UI,这会惹恼用户,并且您最终可能会根据程序的复杂性得出不可预测的结果(我见过一个应用程序,其中两个方法在UI 线程,每个线程都重复调用 DoEvents()...)。

应该这样做:
  • 任何时候您的应用程序必须等待某事发生(即磁盘读取、Web 服务调用或 Sleep()),它都应该在一个单独的线程上。
  • 您不应手动设置 TextBlock.Text - 将其绑定(bind)到属性并实现 INotifyPropertyChanged。

  • 这是一个显示您要求的功能的示例。编写只需要几秒钟的时间,而且使用起来更容易 - 而且它不会锁定 UI。

    Xaml:
    <StackPanel>
    <TextBlock Name="MyTextBlock" Text="{Binding Path=MyValue}"></TextBlock>
    <Button Click="Button_Click">OK</Button>
    </StackPanel>

    代码隐藏:
    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 的基石,并且需要一些练习 - 非常值得学习。

    关于wpf - 如何刷新循环内设置的可视控件属性 (TextBlock.text)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5504244/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com