WPF 在应用程序启动时加载 texbox 内容

WPF load texbox content at Application startup

我遇到以下情况:一个包含 2 个页面的 WPF 应用程序(使用导航)。在其中一个页面上有一个文本框,它使用 WMI 查询和注册表数据显示一些系统信息。

这种方法的问题是,当我导航到该页面时,信息总是会刷新,这也意味着后面所有的工作都需要重新完成,这使得 texbox 需要一些时间才能开始显示信息(是的,一些 WMI 查询很耗时)。

由于我需要的数据中有 99% 不需要刷新(不会更改),我将如何只执行一次然后将其绑定到该文本框以使其不总是刷新?

home.xaml.cs(页面)中的文本框代码

private void TextBox1_Loaded(object sender, RoutedEventArgs e)
    {
        BackgroundWorker bw = new BackgroundWorker();
        bw.WorkerReportsProgress = true;
        bw.DoWork += new DoWorkEventHandler(delegate (object o, DoWorkEventArgs args)
        {
           
        });
        bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(delegate (object o, RunWorkerCompletedEventArgs args)
        {
            TextBox1.Text = Registry.GetValue(@"HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor[=10=]", "ProcessorNameString", null).ToString().Replace("(R)", "").Replace("(TM)", "") + Environment.NewLine;
            TextBox1.Text += "Memory:  " + getRAMsize() + Environment.NewLine;
            TextBox1.Text += "Free Space:  " + GetTotalFreeSpace(sysdrive) + " GB" + Environment.NewLine;
            if (Is64BitSystem)
            {
                TextBox1.Text += getOS() + " 64bit" + Environment.NewLine;
            }
            else
            {
                TextBox1.Text += getOS() + " 32bit" + Environment.NewLine;
            }
            TextBox1.Text += diskname() + Environment.NewLine;
            TextBox1.Text += "MAC Address : " + System.Text.RegularExpressions.Regex.Replace(GetMacAddress().ToString(), ".{2}", "$&-").TrimEnd('-') + Environment.NewLine;
            TextBox1.Text += av();
        });
        bw.RunWorkerAsync();
    }

它的作用与我想要的:每次我导航到它时,文本框都会刷新(textbox_loaded...当然),这需要一两秒钟。我想禁用刷新。我希望它加载一次并保留这些值,直到应用程序再次打开。

你可以在第一次 运行 时设置一个 bool 标志。

public void Initilize()
{
    if (!_Initilized)
    {
        _Initilized = true;

        // do initial queries here...
    }
    myusercontrol.DataContext = MyViewModel;
}

哇...经过反复试验,我不敢相信将代码放入 TextBox1_Initialized 事件中如此简单。

private void TextBox1_Initialized(object sender, RoutedEventArgs e)
{
    BackgroundWorker bw = new BackgroundWorker();
    bw.WorkerReportsProgress = true;
    bw.DoWork += new DoWorkEventHandler(delegate (object o, DoWorkEventArgs args)
    {

    });
    bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(delegate (object o, RunWorkerCompletedEventArgs args)
    {
        TextBox1.Text = Registry.GetValue(@"HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor[=10=]", "ProcessorNameString", null).ToString().Replace("(R)", "").Replace("(TM)", "") + Environment.NewLine;
        TextBox1.Text += "Memory:  " + getRAMsize() + Environment.NewLine;
        TextBox1.Text += "Free Space:  " + GetTotalFreeSpace(sysdrive) + " GB" + Environment.NewLine;
        if (Is64BitSystem)
        {
            TextBox1.Text += getOS() + " 64bit" + Environment.NewLine;
        }
        else
        {
            TextBox1.Text += getOS() + " 32bit" + Environment.NewLine;
        }
        TextBox1.Text += diskname() + Environment.NewLine;
        TextBox1.Text += "MAC Address : " + System.Text.RegularExpressions.Regex.Replace(GetMacAddress().ToString(), ".{2}", "$&-").TrimEnd('-') + Environment.NewLine;
        TextBox1.Text += av();
    });
    bw.RunWorkerAsync();
}