WPF загружает содержимое texbox при запуске приложения - PullRequest
0 голосов
/ 02 декабря 2018

У меня следующая ситуация: Приложение WPF с 2 страницами (с использованием навигации).На одной из страниц есть текстовое поле, которое отображает некоторую системную информацию, используя запросы WMI и данные реестра.Проблема с этим подходом заключается в том, что эта информация всегда обновляется, когда я перехожу на эту страницу, что также означает, что все задачи, выполняемые за этим заданием, выполняются заново, что заставляет texbox занять некоторое время, прежде чем он начнет отображать информацию (да,некоторые запросы WMI отнимают много времени).Поскольку 99 процентов данных, которые мне нужны, не нуждаются в обновлении (не изменяются), как мне выполнить их только один раз, а затем привязать к этому текстовому полю, чтобы оно не всегда обновлялось?

код textboxt в 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\0", "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 ... конечно), и это занимаетвторой или два.Я хочу отключить обновление.Я хочу, чтобы он загружался один раз и сохранял эти значения до тех пор, пока приложение не откроется снова

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Ух ты ... после долгих проб и ошибок, я не могу поверить, что это было так просто, как поместить код в событие 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\0", "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();
}
0 голосов
/ 02 декабря 2018

Вы можете установить флаг bool при первом запуске.

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

        // do initial queries here...
    }
    myusercontrol.DataContext = MyViewModel;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...