2015-11-10 2 views
0

Как я могу обновить второе окно (это простое окно WPF с индикатором прогресса, чтобы показать прогресс) изнутри моего MainWindow внутри цикла?C# Обновление второго окна с первого

Ну, я загружаю пару файлов, которые могут стоить около 10 секунд. Во время загрузки я хочу, чтобы мой ProgressWindow показывал, сколько файлов загружено.

Вот мой MainThread:

private void loadFiles(String[] paths) { 

     // Show Progress Window 
     MyProgressWindow progWindow = new MyProgressWindow(); 
     progWindow.ShowProgressWindow(0, paths.Length); 
     //Globals.MyProgressController.ShowProgressWindow(0, paths.Length); 

     foreach (String path in paths) { 

      // Load the file 
      loadFile(path); 

      // Refresh the Table 
      refreshTableAsync(); 

      // Update Progress Window 
      progWindow.UpdateProgressWindow(1); 
      //Globals.MyProgressController.UpdateProgressWindow(1); 
     } 

     // Close Progress Window 
     progWindow.CloseProgressWindow(); 
     //Globals.MyProgressController.CloseProgressWindow(); 
    } 

Вот ProgressWindowController

public class MyProgressWindow { 
    private ProgressWindow progressWindow; 

    public void ShowProgressWindow(int startIndex, int maxIndex) { 
     progressWindow = new ProgressWindow(); 
     progressWindow.Initialize(startIndex, maxIndex); 
     progressWindow.Show(); 
    } 

    public void UpdateProgressWindow(int value) { 
     progressWindow.Update(value); 
     //progressWindow.Update(); 
    } 

    public void CloseProgressWindow() { 
     progressWindow.Close(); 
    } 
} 

И, наконец, сам ProgressWindow:

public partial class ProgressWindow : Window { 

    private int actualValue = 0; 
    private int maxValue = 0; 

    public ProgressWindow() { 
     InitializeComponent(); 
    } 

    public void Initialize(int startValue, int maxValue) { 
     this.actualValue = startValue; 
     this.maxValue = maxValue; 
    } 

    public void Update(int value) { 
     actualValue += value; 
     lblPercentage.Content = actualValue + "/" + maxValue; 
     pbProgress.Value = ((double)value/maxValue) * 100; 
    } 
} 

Я прочитал thati должны делать это с помощью резьбы, но я не могу заставить его работать, и весь код, который я нашел, который помогал другим людям, не работает Я делаю то, что мне нужно.

Спасибо за вашу помощь

+0

вы можете использовать шаблон [MVVM] (https://en.wikipedia.org/wiki/Model_View_ViewModel). у вас есть один общий ViewModel. Mainwindow обновляется, и SubWindow просто показывает данные. – Jens

+0

также вы можете добавить событие в общую область – ZSH

+0

Ну, я думал, что смогу сделать это без шаблона MVVM, потому что это всего лишь небольшой фрагмент кода и приносит еще некоторую сложность, это не хорошо –

ответ

1

Ваш вопрос поставлен неправильно. Вы обновляете второе окно в соответствии с вашим вопросом, однако предлагаемый совет использования отдельного потока - это то, о чем вы действительно спрашиваете.

Предлагаю ознакомиться с классом BackgroundWorkerHere, который даже объясняет прогресс обновления.

Смежные вопросы