Как из потока добавить строки в листбокс?

XAML WPF проект.
Скорее всего я делаю многие вещи не правильно, прошу поправить.

Я пишу приложение по поиску exe файлов в папке.
Суть простая - нашли в папке exe файл - вывели путь к нему в листбокс.

В XAML разметке у меня есть листбокс
<ListBox Name="ListBox1" Grid.Row="0"/>
И туда нужно добавлять строки (элементы).

MainWindow.xaml.cs
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
    
// Поиск в потоке
Thread thread1 = new Thread(InstalledPrograms.FindPrograms);
thread1.Start(); // Запуск потока.
}
}

static class InstalledPrograms
{
public static void FindPrograms()
{
// Тут позже будет код поиска программ.

//Ошибка - Для нестатического поля, метода или свойства "MainWindow.ListBox1" требуется ссылка на объект.
MainWindow.ListBox1.Items.Add("Путь к программе");
}
}


1) Как из потока добавить строки в листбокс?
PS
В чем разница между MainWindow.xaml.cs и App.xaml.cs? Может я ещё и не туда пишу код?
Да там подписано MainWindow.xaml.cs - Логика взаимодействия для MainWindow.xaml и
App.xaml.cs - Логика взаимодействия для App.xaml, но куда писать код?
А точнее по какому признаку (и надо ли) его разделять?
  • Вопрос задан
  • 165 просмотров
Пригласить эксперта
Ответы на вопрос 2
vabka
@vabka Куратор тега C#
Токсичный шарпист
В чем разница между MainWindow.xaml.cs и App.xaml.cs? Может я ещё и не туда пишу код?

MainWindow - это про главное окно. App - это про приложение в целом.

Как из потока добавить строки в листбокс?

Из другого потока нельзя добавлять, тк к UI-элементам можно обращаться только из UI-потока.
Для нестатического поля, метода или свойства "MainWindow.ListBox1" требуется ссылка на объект.

Ну да, нельзя. Нужно передавать экземпляр окна.
Например так:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
    
// Поиск в потоке
Thread thread1 = new Thread(()=>InstalledPrograms.FindPrograms(this));
thread1.Start(); // Запуск потока.
}
}

static class InstalledPrograms
{
public static void FindPrograms(MainWindow mainWindow)
{
// Тут позже будет код поиска программ.

//Ошибка - Для нестатического поля, метода или свойства "MainWindow.ListBox1" требуется ссылка на объект.
mainWindow.ListBox1.Items.Add("Путь к программе");
}
}
Ответ написан
Используйте события (events). В классе, который ищет файл определите событие, что файл найден. В классе окна подпишитесь на это событие и в обработчике добавляйте путь в listbox.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы