Rynovz Ответов: 2

Как перечислить имена папок в списке в visual studio 2019 с помощью WPF и C#


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

Контекст:

Это простой инструмент "mod manager". Установка мода создает папку в документах, и в списке перечислены только имена папок в этом каталоге без их полного пути.

Как мне этого добиться?

Что я уже пробовал:

Imports System.IO


Class MainWindow
    Private Sub ListBox_SelectionChanged(sender As Object, e As SelectionChangedEventArgs)
        Dim fileNames = My.Computer.FileSystem.GetFiles("%userprofiles%\Documents\State of Decay 2 Mod Manager")

        For Each fileName As String In fileNames
            Dim result As String = Path.GetFileName(fileName)
            Dim unused = Listbox1.Items.Add(result)
        Next

    End Sub
End Class

2 Ответов

Рейтинг:
0

phil.o

Вы можете перечислить каталоги в определенном каталоге таким образом:

Imports System.Collections.Generic
Imports System.IO
Imports System.Linq

Public Shared Function GetDirectories(directory As String) As String()
   Dim list As New List(Of String)
   list.AddRange
   (
      Directory.EnumerateDirectories
      (
         Path.Combine
         (
            Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
            directory
         )
      )
   )
   Return list
      '' We have to add a final backslash to each path
      '' for the GetDirectoryName method to work as expected.
      .Select(p => Path.GetDirectoryName(p & "\"))
      .ToArray()
End Function

Использование:
Dim paths As String() = GetDirectories("State of Decay 2 Mod Manager")

Это относится к перечислительной части.

Теперь остается нерешенный вопрос: почему попытка заполнить список на выбранном индексе изменилась? Это событие срабатывает всякий раз, когда выбирается отдельный элемент в списке. Вам лучше заполнить этот список сразу после загрузки формы или всякий раз, когда было внесено изменение в содержимое базового каталога.


Rynovz

Честно говоря, я не понимал, что делает инструкция ListBox_SelectionChanged, пока Ричард не объяснил ее. Это во многом первая попытка сделать это. Идея кажется относительно простой, но реализация кажется значительно более сложной, пока я не пойму, как каждая строка влияет на то, что делает список. Это очень сильно ограничивает мои знания в области кодирования в целом. Какую инструкцию было бы лучше использовать, и где бы она была размещена, чтобы иметь желаемый эффект?

phil.o

Ну, это зависит от потока вашей программы. Вы можете заполнить поле списка сразу после загрузки формы (например, в форме.Активированное событие), или всякий раз, когда были внесены некоторые изменения в содержимое базового каталога.

Rynovz

Было бы лучше, чтобы список обновлялся всякий раз, когда вносятся изменения в базовый каталог. Когда я скопировал ваш код выше, я нарисовал пробел относительно того, куда его вставить. Нужно ли дважды щелкнуть по списку и вставить туда код? Или на самом главном окне?

phil.o

Вы можете разместить общую функцию внутри вашего устройства. MainWindow класс. То Imports инструкции обычно идут в самом начале файла кода.
Затем вы можете использовать эту общую функцию из любого места, где вы решили реализовать список каталогов.

Если вы дважды щелкните по списку, он добавит только обработчик событий для события по умолчанию для списка. ListBox класс, а это совсем не то, чего ты хочешь.
Может быть, вам нужен краткий обзор классов и функций или того, что такое a Shared стихия?

Рейтинг:
0

Richard MacCutchan

Вы не будете захватывать имена файлов до тех пор, пока ListBox_SelectionChanged событие называется. И это не будет вызвано до тех пор, пока не будет сделан выбор элемента в списке, который в данный момент пуст. Вы должны заполнить поле списка при первом запуске приложения, т. е. MainWindow_Load метод. Или используйте кнопку на форме, чтобы запустить его.

В документации есть даже хороший пример кода: Класс ListBox (System.Окна.Формы) | Microsoft Docs[^].


Rynovz

Спасибо за ответ, Ричард. Я читал документацию, и это имеет большой смысл. Что меня сейчас смущает, так это метод MainWindow_Load, о котором вы упомянули. Я тоже не знаю, как сделать так, чтобы кнопка на форме запускала код. Как только я сделаю это один раз, у меня будет хорошая хватка

Richard MacCutchan

Откройте окно конструктор форм в Visual Studio и дважды щелкните на заголовке формы. Это приведет к созданию метода Form_Load. Затем вы можете добавить туда свой код.

Вы упомянули WPF в названии своего вопроса, поэтому я предположил, что вы опытный разработчик. Однако если вы изо всех сил пытаетесь понять основные концепции .NET-приложений, то WPF покажется вам еще более трудным. Я предлагаю вам перейти в раздел статей CodeProject, где вы найдете много полезных руководств по базовой разработке Windows Forms.

Rynovz

Спасибо за совет. Мне сказали использовать WPF, так как это сделает вещи проще, а не сложнее. Я очень ценю ваши отзывы

Richard MacCutchan

Ну, это зависит от того, что вы пытаетесь сделать, и вашего уровня квалификации. И как кто-то новый в кодировании, я думаю, что вы найдете WPF гораздо более сложной задачей, чем Windows Forms.