File- und FolderPicker

    • XAML: WPF MVVM
    • .NET (FX) 4.5–4.8

    Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von siycah.

      File- und FolderPicker

      Hey liebe Community,

      da ich ja in letzter Zeit die Nerven so einiger in Anspruch genommen hab, dachte ich ich geb mal was zurück, und da ich sowieso grad dabei war, hab ich gedacht, ich lade mal meinen File- und FolderPicker hier hoch...

      Ist nichts besonderes, aber halt WPF und MVVM, und ich denke es ist ideal, wenn man neu in MVVM ist, das mal als Projekt zum mit rum spielen zu nehmen, da nicht so umfangreich.

      Die View sieht so aus (im XAML müsst ihr in den Zeilen 25, 31 und 37 noch ein passenders XAML Icon unter Data eintagen; die Buttons funktionieren aber auch so und sind mit Tooltips versehen...; gibts im Internet zu finden...)

      Spoiler anzeigen

      XML-Quellcode

      1. <Grid>
      2. <Grid.ColumnDefinitions>
      3. <ColumnDefinition Width="30*"/>
      4. <ColumnDefinition Width="3"/>
      5. <ColumnDefinition Width="70*"/>
      6. </Grid.ColumnDefinitions>
      7. <Grid.RowDefinitions>
      8. <RowDefinition Height="15*"/>
      9. <RowDefinition Height="60*"/>
      10. <RowDefinition Height="10*"/>
      11. <RowDefinition Height="15*"/>
      12. </Grid.RowDefinitions>
      13. <GridSplitter Grid.Column="1" Grid.Row="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Foreground="{DynamicResource VordergrundfarbeBrush}" Width="3" Background="{DynamicResource VordergrundfarbeBrush}" Margin="0, 10, 0, 10"/>
      14. <Grid Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3" Margin="10">
      15. <Grid.ColumnDefinitions>
      16. <ColumnDefinition Width="85*"/>
      17. <ColumnDefinition Width="5*"/>
      18. <ColumnDefinition Width="5*"/>
      19. <ColumnDefinition Width="5*"/>
      20. </Grid.ColumnDefinitions>
      21. <Border Grid.Column="1" Style="{DynamicResource Navigationsbuttons}" ToolTip="Benenne den aktuellen Ordner um...">
      22. <Border.InputBindings>
      23. <MouseBinding MouseAction="LeftClick" Command="{Binding Umbenennen}"/>
      24. </Border.InputBindings>
      25. <Path Fill="{DynamicResource VordergrundfarbeBrush}" Data=""/>
      26. </Border>
      27. <Border Grid.Column="2" Style="{DynamicResource Navigationsbuttons}" ToolTip="Erstelle im aktuellen Ordner einen neuen Ordner...">
      28. <Border.InputBindings>
      29. <MouseBinding MouseAction="LeftClick" Command="{Binding NeuenOrdnerErstellen}"/>
      30. </Border.InputBindings>
      31. <Path Fill="{DynamicResource VordergrundfarbeBrush}" Data=""/>
      32. </Border>
      33. <Border Grid.Column="3" Style="{DynamicResource Navigationsbuttons}" ToolTip="Springe zum übergeordneten Ordner...">
      34. <Border.InputBindings>
      35. <MouseBinding MouseAction="LeftClick" Command="{Binding SpringeOrdnerDarueber}"/>
      36. </Border.InputBindings>
      37. <Path Fill="{DynamicResource VordergrundfarbeBrush}" Data=""/>
      38. </Border>
      39. <Label Grid.Column="0" VerticalAlignment="Center" Background="Transparent" Foreground="{DynamicResource VordergrundfarbeBrush}" Content="{Binding AktuellerOrdner, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
      40. </Grid>
      41. <ListBox Grid.Row="1" Grid.Column="0" ItemsSource="{Binding RootVerzeichnisseStrings, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" SelectedIndex="{Binding RootIndex, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Background="Transparent" Foreground="{DynamicResource VordergrundfarbeBrush}" Margin="10">
      42. <ListBox.ItemTemplate>
      43. <DataTemplate>
      44. <StackPanel>
      45. <StackPanel.InputBindings>
      46. <MouseBinding Gesture="LeftDoubleClick"
      47. Command="{Binding DataContext.RootAuswaehlen, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}, Mode=OneWay}"
      48. CommandParameter="{Binding }" />
      49. </StackPanel.InputBindings>
      50. <TextBlock Text="{Binding}"/>
      51. </StackPanel>
      52. </DataTemplate>
      53. </ListBox.ItemTemplate>
      54. </ListBox>
      55. <ListBox Grid.Row="1" Grid.Column="2" ItemsSource="{Binding UnterVerzeichnisseStrings, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" Background="Transparent" Foreground="{DynamicResource VordergrundfarbeBrush}" Margin="10" SelectedIndex="{Binding UnterVerzeichnisIndex, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}">
      56. <ListBox.ItemTemplate>
      57. <DataTemplate>
      58. <StackPanel>
      59. <StackPanel.InputBindings>
      60. <MouseBinding Gesture="LeftDoubleClick"
      61. Command="{Binding DataContext.VerzeichnisAuswaehlen, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}, Mode=OneWay}"
      62. CommandParameter="{Binding }" />
      63. </StackPanel.InputBindings>
      64. <TextBlock Text="{Binding}"/>
      65. </StackPanel>
      66. </DataTemplate>
      67. </ListBox.ItemTemplate>
      68. </ListBox>
      69. <Grid Grid.Row="2" Grid.Column="2">
      70. <Grid.ColumnDefinitions>
      71. <ColumnDefinition Width="85"/>
      72. <ColumnDefinition Width="*"/>
      73. <ColumnDefinition Width="130"/>
      74. </Grid.ColumnDefinitions>
      75. <Label Content="Dateiname:" Margin="10, 0, 0, 0" Grid.Column="0" Background="Transparent" Foreground="{DynamicResource VordergrundfarbeBrush}" VerticalAlignment="Center" HorizontalAlignment="Left" Visibility="{Binding DateiNameSichtBar, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"/>
      76. <TextBox Grid.Column="1" Text="{Binding Dateiname, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Background="Transparent" Foreground="{DynamicResource VordergrundfarbeBrush}" Visibility="{Binding DateiNameSichtBar, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Center" Margin="0, 0, 10, 0"/>
      77. <ComboBox Grid.Column="2" ItemsSource="{Binding DateiTypen, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" IsEditable="False" SelectedItem="{Binding GewaehlterDateiTyp, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Center" Margin="0, 0, 10, 0" SelectedIndex="{Binding DateiTypIndex, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Stretch" Visibility="{Binding DateiNameSichtBar, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"/>
      78. </Grid>
      79. <Grid Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="3">
      80. <Grid.ColumnDefinitions>
      81. <ColumnDefinition Width="50*"/>
      82. <ColumnDefinition Width="50*"/>
      83. </Grid.ColumnDefinitions>
      84. <Button Margin="10" Content="OK" Command="{Binding OK}" Grid.Column="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
      85. <Button Margin="10" Content="Abbrechen" Command="{Binding Abbrechen}" Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
      86. </Grid>
      87. </Grid>


      Und das ViewModel:

      Spoiler anzeigen

      Quellcode

      1. Option Strict On
      2. Imports System.Collections.ObjectModel
      3. Imports System.IO
      4. Imports System.Windows
      5. Imports System.Windows.Input
      6. Imports Microsoft.VisualBasic
      7. Public Class FolderBrowserViewModel
      8. Inherits Instrastructure.ViewModelBase
      9. 'Private dialogService As Services.IDialogWindowService = Services.ServiceContainer.GetService(Of Services.IDialogWindowService)
      10. Public Optionen As Options
      11. Private _DateiTypen As ObservableCollection(Of String)
      12. Public Property DateiTypen As ObservableCollection(Of String)
      13. Get
      14. Return _DateiTypen
      15. End Get
      16. Set(value As ObservableCollection(Of String))
      17. _DateiTypen = value
      18. RaisePropertyChanged()
      19. End Set
      20. End Property
      21. Public Property Ergebnis As String
      22. Public Enum Options
      23. FolderPicker = 0
      24. OpenFile = 1
      25. SaveFile = 2
      26. End Enum
      27. Public Sub New() 'zum Testen hier ein parameterloser Konstruktor
      28. RootIndex = -1
      29. Optionen = Options.OpenFile
      30. DateiTypen = New ObservableCollection(Of String)
      31. Initialisieren()
      32. 'AktuellerOrdner = ""
      33. End Sub
      34. Public Sub New(argStartVerzeichnis As String, argOptions As Options, argDateiTypen As List(Of String))
      35. RootIndex = -1
      36. Optionen = argOptions
      37. DateiTypen = New ObservableCollection(Of String)(argDateiTypen)
      38. Initialisieren()
      39. If System.IO.Directory.Exists(argStartVerzeichnis) Then
      40. AktuellerOrdner = argStartVerzeichnis
      41. End If
      42. End Sub
      43. Private Sub Initialisieren()
      44. If IsInDesignMode = False Then
      45. RootVerzeichnisse = New ObservableCollection(Of Model.RootVerzeichnisseModel)
      46. UnterVerzeichnisse = New ObservableCollection(Of String)
      47. Dim LaufWerkTyp As String
      48. For Each Laufwerk In System.IO.DriveInfo.GetDrives
      49. If Laufwerk.DriveType = DriveType.CDRom Then
      50. LaufWerkTyp = "CD/DVD-ROM"
      51. ElseIf Laufwerk.DriveType = DriveType.Fixed Then
      52. LaufWerkTyp = "Festplatte"
      53. ElseIf Laufwerk.DriveType = DriveType.Network Then
      54. LaufWerkTyp = "Netzlaufwerk"
      55. ElseIf Laufwerk.DriveType = DriveType.Ram Then
      56. LaufWerkTyp = "RAM-Speicher"
      57. ElseIf Laufwerk.DriveType = DriveType.Removable Then
      58. LaufWerkTyp = "Wechseldatenträger"
      59. Else
      60. LaufWerkTyp = "Unbekannter Datenträgertyp"
      61. End If
      62. Dim LaufwerksName As String
      63. Try
      64. LaufwerksName = Laufwerk.VolumeLabel
      65. Catch ex As Exception
      66. LaufwerksName = ""
      67. End Try
      68. RootVerzeichnisse.Add(New Model.RootVerzeichnisseModel(Laufwerk.Name, LaufwerksName, LaufWerkTyp))
      69. Next
      70. RootVerzeichnisse.Add(New Model.RootVerzeichnisseModel(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures), "Meine Bilder", "Bibliothek"))
      71. RootVerzeichnisse.Add(New Model.RootVerzeichnisseModel(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Mein Desktop", "Bibliothek"))
      72. RootVerzeichnisse.Add(New Model.RootVerzeichnisseModel(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "Meine Dokumente", "Bibliothek"))
      73. RootVerzeichnisse.Add(New Model.RootVerzeichnisseModel(Environment.GetFolderPath(Environment.SpecialFolder.MyMusic), "Meine Musik", "Bibliothek"))
      74. RootVerzeichnisse.Add(New Model.RootVerzeichnisseModel(Environment.GetFolderPath(Environment.SpecialFolder.MyVideos), "Meine Videos", "Bibliothek"))
      75. RootVerzeichnisse.Add(New Model.RootVerzeichnisseModel(Environment.GetFolderPath(Environment.SpecialFolder.CommonPictures), "Öffentliche Bilder", "Bibliothek"))
      76. RootVerzeichnisse.Add(New Model.RootVerzeichnisseModel(Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments), "Öffentliche Dokumente", "Bibliothek"))
      77. RootVerzeichnisse.Add(New Model.RootVerzeichnisseModel(Environment.GetFolderPath(Environment.SpecialFolder.CommonMusic), "Öffentliche Musik", "Bibliothek"))
      78. RootVerzeichnisse.Add(New Model.RootVerzeichnisseModel(Environment.GetFolderPath(Environment.SpecialFolder.CommonVideos), "Öffentliche Videos", "Bibliothek"))
      79. If Optionen = Options.SaveFile Then
      80. DateiNameSichtBar = Visibility.Visible
      81. Else
      82. DateiNameSichtBar = Visibility.Hidden
      83. End If
      84. If (Optionen = Options.OpenFile) Or (Optionen = Options.SaveFile) Then
      85. If DateiTypen.Count > 0 Then DateiTypIndex = 0
      86. End If
      87. End If
      88. End Sub
      89. Private _OK As ICommand
      90. Public ReadOnly Property OK As ICommand
      91. Get
      92. If _OK Is Nothing Then _OK = New ViewModel.Instrastructure.RelayCommand(AddressOf OK_Execute)
      93. Return _OK
      94. End Get
      95. End Property
      96. Private Sub OK_Execute(obj As Object)
      97. Select Case Optionen
      98. Case Options.FolderPicker
      99. Ergebnis = AktuellerOrdner
      100. Case Options.OpenFile
      101. If UnterVerzeichnisIndex <> -1 Then
      102. Dim IsDir As Boolean = System.IO.File.GetAttributes(UnterVerzeichnisse(UnterVerzeichnisIndex)) = FileAttributes.Directory
      103. If IsDir Then
      104. 'Dim OKVM = New OKDialogViewModel
      105. 'OKVM.Meldung = "Du hast einen Ordner ausgewählt. Bitte wähle eine Datei aus."
      106. 'dialogService.ShowModalDialog("", OKVM, Me, True, False, Services.WindowStyle.None, Services.ResizeMode.NoResize, 500, Services.SizeToContent.Height, Services.WindowStartupLocation.CenterOwner, "")
      107. MessageBox.Show("Du hast einen Ordner ausgewählt. Bitte wähle eine Datei aus.")
      108. Return
      109. Else
      110. Ergebnis = UnterVerzeichnisse(UnterVerzeichnisIndex)
      111. End If
      112. Else
      113. 'Dim OKVM = New OKDialogViewModel
      114. 'OKVM.Meldung = "Bitte wähle eine Datei aus."
      115. 'dialogService.ShowModalDialog("", OKVM, Me, True, False, Services.WindowStyle.None, Services.ResizeMode.NoResize, 500, Services.SizeToContent.Height, Services.WindowStartupLocation.CenterOwner, "")
      116. MessageBox.Show("Bitte wähle eine Datei aus.")
      117. Return
      118. End If
      119. Case Options.SaveFile
      120. If String.IsNullOrEmpty(Dateiname) Then
      121. 'Dim OKVM = New OKDialogViewModel
      122. 'OKVM.Meldung = "Bitte gebe einen Dateinamen an."
      123. 'dialogService.ShowModalDialog("", OKVM, Me, True, False, Services.WindowStyle.None, Services.ResizeMode.NoResize, 500, Services.SizeToContent.Height, Services.WindowStartupLocation.CenterOwner, "")
      124. MessageBox.Show("Bitte gebe einen Dateinamen an.")
      125. Return
      126. End If
      127. If String.IsNullOrEmpty(GewaehlterDateiTyp) Then
      128. 'Dim OKVM = New OKDialogViewModel
      129. 'OKVM.Meldung = "Bitte wähle einen Dateityp aus."
      130. 'dialogService.ShowModalDialog("", OKVM, Me, True, False, Services.WindowStyle.None, Services.ResizeMode.NoResize, 500, Services.SizeToContent.Height, Services.WindowStartupLocation.CenterOwner, "")
      131. MessageBox.Show("Bitte wähle einen Dateityp aus.")
      132. Return
      133. End If
      134. For Each Zeichen In System.IO.Path.GetInvalidFileNameChars
      135. If Dateiname.Contains(Zeichen) Then
      136. 'Dim OKVM = New OKDialogViewModel
      137. 'OKVM.Meldung = "Du hast ein ungültiges Zeichen (" & Zeichen & ") im Dateinamen. Bitte gebe einen gültigen Dateinamen an."
      138. 'dialogService.ShowModalDialog("", OKVM, Me, True, False, Services.WindowStyle.None, Services.ResizeMode.NoResize, 500, Services.SizeToContent.Height, Services.WindowStartupLocation.CenterOwner, "")
      139. MessageBox.Show("Du hast ein ungültiges Zeichen (" & Zeichen & ") im Dateinamen. Bitte gebe einen gültigen Dateinamen an.")
      140. Return
      141. End If
      142. Next
      143. Ergebnis = AktuellerOrdner & "\" & Dateiname & GewaehlterDateiTyp
      144. End Select
      145. 'dialogService.CloseDialog(Me)
      146. End Sub
      147. Private _Abbrechen As ICommand
      148. Public ReadOnly Property Abbrechen As ICommand
      149. Get
      150. If _Abbrechen Is Nothing Then _Abbrechen = New ViewModel.Instrastructure.RelayCommand(AddressOf Abbrechen_Execute)
      151. Return _Abbrechen
      152. End Get
      153. End Property
      154. Private Sub Abbrechen_Execute(obj As Object)
      155. Ergebnis = ""
      156. 'dialogService.CloseDialog(Me)
      157. End Sub
      158. Private _Dateiname As String
      159. Public Property Dateiname As String
      160. Get
      161. Return _Dateiname
      162. End Get
      163. Set(value As String)
      164. _Dateiname = value
      165. RaisePropertyChanged()
      166. End Set
      167. End Property
      168. Private _RootVerzeichnisse As ObservableCollection(Of Model.RootVerzeichnisseModel)
      169. Public Property RootVerzeichnisse As ObservableCollection(Of Model.RootVerzeichnisseModel)
      170. Get
      171. Return _RootVerzeichnisse
      172. End Get
      173. Set(value As ObservableCollection(Of Model.RootVerzeichnisseModel))
      174. _RootVerzeichnisse = value
      175. RaisePropertyChanged()
      176. End Set
      177. End Property
      178. Public ReadOnly Property RootVerzeichnisseStrings As ObservableCollection(Of String)
      179. Get
      180. Dim retList As New List(Of String)
      181. For Each Laufwerk In RootVerzeichnisse
      182. If Laufwerk.Typ <> "Bibliothek" Then
      183. retList.Add(Laufwerk.Pfad & " " & Laufwerk.Bezeichnung & " (" & Laufwerk.Typ & ")")
      184. Else
      185. retList.Add(Laufwerk.Bezeichnung & " (" & Laufwerk.Typ & ")")
      186. End If
      187. Next
      188. Return New ObservableCollection(Of String)(retList)
      189. RaisePropertyChanged()
      190. End Get
      191. End Property
      192. Private _UnterVerzeichnisse As ObservableCollection(Of String)
      193. Public Property UnterVerzeichnisse As ObservableCollection(Of String)
      194. Get
      195. Return _UnterVerzeichnisse
      196. End Get
      197. Set(value As ObservableCollection(Of String))
      198. _UnterVerzeichnisse = value
      199. RaisePropertyChanged()
      200. End Set
      201. End Property
      202. 'Private _RootGewaehlt As ICommand
      203. 'Public ReadOnly Property RootGewaehlt As ICommand
      204. ' Get
      205. ' If _RootGewaehlt Is Nothing Then _RootGewaehlt = New ViewModel.Instrastructure.RelayCommand(AddressOf RootGewaehlt_Execute)
      206. ' Return _RootGewaehlt
      207. ' End Get
      208. 'End Property
      209. 'Private Sub RootGewaehlt_Execute(obj As Object)
      210. ' UnterVerzeichnisse = New ObservableCollection(Of String)
      211. ' For Each Unterverzeichnis In System.IO.Directory.GetDirectories(RootVerzeichnisse(RootIndex).Pfad)
      212. ' UnterVerzeichnisse.Add(Unterverzeichnis)
      213. ' Next
      214. ' RaisePropertyChanged(NameOf(UnterVerzeichnisse))
      215. 'End Sub
      216. Private _RootIndex As Integer
      217. Public Property RootIndex As Integer
      218. Get
      219. Return _RootIndex
      220. End Get
      221. Set(value As Integer)
      222. _RootIndex = value
      223. 'If value <> -1 Then AktuellerOrdner = RootVerzeichnisse(value).Pfad
      224. RaisePropertyChanged()
      225. End Set
      226. End Property
      227. Private _AktuellerOrdner As String
      228. Public Property AktuellerOrdner As String
      229. Get
      230. Return _AktuellerOrdner
      231. End Get
      232. Set(value As String)
      233. Dim UnsortierteListe As New List(Of String)
      234. UnterVerzeichnisse = New ObservableCollection(Of String)
      235. Try
      236. For Each Unterverzeichnis In System.IO.Directory.GetDirectories(value)
      237. UnsortierteListe.Add(Unterverzeichnis)
      238. Next
      239. UnsortierteListe.Sort()
      240. UnterVerzeichnisse = New ObservableCollection(Of String)(UnsortierteListe)
      241. UnsortierteListe.Clear()
      242. If (Optionen = Options.OpenFile) Or (Optionen = Options.SaveFile) Then
      243. For Each Datei In System.IO.Directory.GetFiles(value)
      244. For Each DateiTyp In DateiTypen
      245. If Datei.ToLower.EndsWith(DateiTyp) Then
      246. UnsortierteListe.Add(Datei)
      247. End If
      248. Next
      249. UnsortierteListe.Sort()
      250. For Each item In UnsortierteListe
      251. UnterVerzeichnisse.Add(item)
      252. Next
      253. 'UnterVerzeichnisse.Add(Datei)
      254. Next
      255. End If
      256. _AktuellerOrdner = value
      257. Catch ex As Exception
      258. 'Dim OKVM = New OKDialogViewModel
      259. 'OKVM.Meldung = "Dieser Ordner konnte nicht geöffnet werden." & Environment.NewLine & "Fehlermeldung: " & ex.Message
      260. 'dialogService.ShowModalDialog("", OKVM, Me, True, False, Services.WindowStyle.None, Services.ResizeMode.NoResize, 500, Services.SizeToContent.Height, Services.WindowStartupLocation.CenterOwner, "")
      261. MessageBox.Show("Dieser Ordner konnte nicht geöffnet werden." & Environment.NewLine & "Fehlermeldung: " & ex.Message)
      262. Return
      263. End Try
      264. RaisePropertyChanged(NameOf(UnterVerzeichnisseStrings))
      265. RaisePropertyChanged()
      266. End Set
      267. End Property
      268. Private _UnterVerzeichnisIndex As Integer
      269. Public Property UnterVerzeichnisIndex As Integer
      270. Get
      271. Return _UnterVerzeichnisIndex
      272. End Get
      273. Set(value As Integer)
      274. _UnterVerzeichnisIndex = value
      275. 'If (value <> -1) Then
      276. ' Dim IsDir As Boolean = System.IO.File.GetAttributes(UnterVerzeichnisse(value)) = FileAttributes.Directory
      277. ' If IsDir Then AktuellerOrdner = UnterVerzeichnisse(value)
      278. 'End If
      279. RaisePropertyChanged()
      280. End Set
      281. End Property
      282. Public ReadOnly Property UnterVerzeichnisseStrings As ObservableCollection(Of String)
      283. Get
      284. Dim retList As New List(Of String)
      285. For Each Verzeichnis In UnterVerzeichnisse
      286. retList.Add(New System.IO.DirectoryInfo(Verzeichnis).Name)
      287. Next
      288. Return New ObservableCollection(Of String)(retList)
      289. RaisePropertyChanged()
      290. End Get
      291. End Property
      292. Private _SpringeOrdnerDarueber As ICommand
      293. Public ReadOnly Property SpringeOrdnerDarueber As ICommand
      294. Get
      295. If _SpringeOrdnerDarueber Is Nothing Then _SpringeOrdnerDarueber = New ViewModel.Instrastructure.RelayCommand(AddressOf SpringeOrdnerDarueber_Execute)
      296. Return _SpringeOrdnerDarueber
      297. End Get
      298. End Property
      299. Private Sub SpringeOrdnerDarueber_Execute(obj As Object)
      300. If (Not String.IsNullOrEmpty(AktuellerOrdner)) AndAlso (Not AktuellerOrdner.Length = 3) Then
      301. Dim OrdnerInfo As New System.IO.DirectoryInfo(AktuellerOrdner)
      302. AktuellerOrdner = OrdnerInfo.Parent.FullName
      303. End If
      304. End Sub
      305. Private _GewaehlterDateiTyp As String
      306. Public Property GewaehlterDateiTyp As String
      307. Get
      308. Return _GewaehlterDateiTyp
      309. End Get
      310. Set(value As String)
      311. _GewaehlterDateiTyp = value
      312. RaisePropertyChanged()
      313. End Set
      314. End Property
      315. Private _DateiNameSichtBar As Visibility
      316. Public Property DateiNameSichtBar As Visibility
      317. Get
      318. Return _DateiNameSichtBar
      319. End Get
      320. Set(value As Visibility)
      321. _DateiNameSichtBar = value
      322. RaisePropertyChanged()
      323. End Set
      324. End Property
      325. Private _NeuenOrdnerErstellen As ICommand
      326. Public ReadOnly Property NeuenOrdnerErstellen As ICommand
      327. Get
      328. If _NeuenOrdnerErstellen Is Nothing Then _NeuenOrdnerErstellen = New ViewModel.Instrastructure.RelayCommand(AddressOf NeuenOrdnerErstellen_Execute)
      329. Return _NeuenOrdnerErstellen
      330. End Get
      331. End Property
      332. Private Sub NeuenOrdnerErstellen_Execute(obj As Object)
      333. Dim result As String = Interaction.InputBox("Bitte gebe einen Namen für den neuen Ordner ein:")
      334. 'Dim InputBoxVM = New ViewModel.InputBoxDialogViewModel("Bitte gebe einen Namen für den neuen Ordner ein:")
      335. 'dialogService.ShowModalDialog("", InputBoxVM, Me, True, False, Services.WindowStyle.None, Services.ResizeMode.NoResize, 500, Services.SizeToContent.Height, Services.WindowStartupLocation.CenterOwner, "")
      336. If result = "" Then Return
      337. Dim NeuerOrdnerName As String = result
      338. 'Dim NeuerOrdnerName As String = Interaction.InputBox("Bitte gebe einen Namen für den neuen Ordner ein.")
      339. For Each Zeichen In System.IO.Path.GetInvalidPathChars
      340. If NeuerOrdnerName.Contains(Zeichen) Then
      341. 'Dim OKVM = New OKDialogViewModel
      342. 'OKVM.Meldung = "Du hast ein ungültiges Zeichen (" & Zeichen & ") im neuen Ordnernamen. Bitte gebe einen gültigen Ordnernamen an."
      343. 'dialogService.ShowModalDialog("", OKVM, Me, True, False, Services.WindowStyle.None, Services.ResizeMode.NoResize, 500, Services.SizeToContent.Height, Services.WindowStartupLocation.CenterOwner, "")
      344. MessageBox.Show("Du hast ein ungültiges Zeichen (" & Zeichen & ") im neuen Ordnernamen. Bitte gebe einen gültigen Ordnernamen an.")
      345. Return
      346. End If
      347. Next
      348. Try
      349. System.IO.Directory.CreateDirectory(AktuellerOrdner & "\" & NeuerOrdnerName)
      350. AktuellerOrdner = AktuellerOrdner
      351. Catch ex As Exception
      352. 'Dim OKVM = New OKDialogViewModel
      353. 'OKVM.Meldung = "Der neue Ordner konnte nicht erstellt werden. " & Environment.NewLine & "Fehlermeldung: " & ex.Message
      354. 'dialogService.ShowModalDialog("", OKVM, Me, True, False, Services.WindowStyle.None, Services.ResizeMode.NoResize, 500, Services.SizeToContent.Height, Services.WindowStartupLocation.CenterOwner, "")
      355. MessageBox.Show("Der neue Ordner konnte nicht erstellt werden. " & Environment.NewLine & "Fehlermeldung: " & ex.Message)
      356. End Try
      357. End Sub
      358. Private _Umbenennen As ICommand
      359. Public ReadOnly Property Umbenennen As ICommand
      360. Get
      361. If _Umbenennen Is Nothing Then _Umbenennen = New ViewModel.Instrastructure.RelayCommand(AddressOf Umbenennen_Execute)
      362. Return _Umbenennen
      363. End Get
      364. End Property
      365. Private Sub Umbenennen_Execute(obj As Object)
      366. 'Dim InputBoxVM = New ViewModel.InputBoxDialogViewModel("Bitte gebe einen neuen Namen für den aktuellen Ordner ein:")
      367. 'dialogService.ShowModalDialog("", InputBoxVM, Me, True, False, Services.WindowStyle.None, Services.ResizeMode.NoResize, 500, Services.SizeToContent.Height, Services.WindowStartupLocation.CenterOwner, "")
      368. Dim result As String = Interaction.InputBox("Bitte gebe einen neuen Namen für den aktuellen Ordner ein:")
      369. If result = "" Then Return
      370. Dim NeuerOrdnerName As String = result
      371. 'Dim NeuerOrdnerName As String = Interaction.InputBox("Bitte gebe einen neuen Namen für den aktuellen Ordner ein.")
      372. For Each Zeichen In System.IO.Path.GetInvalidPathChars
      373. If NeuerOrdnerName.Contains(Zeichen) Then
      374. 'Dim OKVM = New OKDialogViewModel
      375. 'OKVM.Meldung = "Du hast ein ungültiges Zeichen (" & Zeichen & ") im neuen Ordnernamen. Bitte gebe einen gültigen Ordnernamen an."
      376. 'dialogService.ShowModalDialog("", OKVM, Me, True, False, Services.WindowStyle.None, Services.ResizeMode.NoResize, 500, Services.SizeToContent.Height, Services.WindowStartupLocation.CenterOwner, "")
      377. MessageBox.Show("Du hast ein ungültiges Zeichen (" & Zeichen & ") im neuen Ordnernamen. Bitte gebe einen gültigen Ordnernamen an.")
      378. Return
      379. End If
      380. Next
      381. Try
      382. Dim OrdnerInfo As New System.IO.DirectoryInfo(AktuellerOrdner)
      383. Dim ParentVerzeichnis As String = OrdnerInfo.Parent.FullName
      384. System.IO.Directory.Move(AktuellerOrdner, ParentVerzeichnis & "\" & NeuerOrdnerName)
      385. AktuellerOrdner = ParentVerzeichnis & "\" & NeuerOrdnerName
      386. Catch ex As Exception
      387. 'Dim OKVM = New OKDialogViewModel
      388. 'OKVM.Meldung = "Der Ordner konnte nicht umbenannt werden. " & Environment.NewLine & "Fehlermeldung: " & ex.Message
      389. 'dialogService.ShowModalDialog("", OKVM, Me, True, False, Services.WindowStyle.None, Services.ResizeMode.NoResize, 500, Services.SizeToContent.Height, Services.WindowStartupLocation.CenterOwner, "")
      390. MessageBox.Show("Der Ordner konnte nicht umbenannt werden. " & Environment.NewLine & "Fehlermeldung: " & ex.Message)
      391. End Try
      392. End Sub
      393. Private _DateiTypIndex As Integer
      394. Public Property DateiTypIndex As Integer
      395. Get
      396. Return _DateiTypIndex
      397. End Get
      398. Set(value As Integer)
      399. _DateiTypIndex = value
      400. RaisePropertyChanged()
      401. End Set
      402. End Property
      403. Private _VerzeichnisAuswaehlen As ICommand
      404. Public ReadOnly Property VerzeichnisAuswaehlen As ICommand
      405. Get
      406. If _VerzeichnisAuswaehlen Is Nothing Then _VerzeichnisAuswaehlen = New ViewModel.Instrastructure.RelayCommand(AddressOf VerzeichnisAuswaehlen_Execute)
      407. Return _VerzeichnisAuswaehlen
      408. End Get
      409. End Property
      410. Private Sub VerzeichnisAuswaehlen_Execute(obj As Object)
      411. If (UnterVerzeichnisIndex <> -1) Then
      412. Dim IsDir As Boolean = System.IO.File.GetAttributes(UnterVerzeichnisse(UnterVerzeichnisIndex)) = FileAttributes.Directory
      413. If IsDir Then AktuellerOrdner = UnterVerzeichnisse(UnterVerzeichnisIndex)
      414. End If
      415. End Sub
      416. Private _RootAuswaehlen As ICommand
      417. Public ReadOnly Property RootAuswaehlen As ICommand
      418. Get
      419. If _RootAuswaehlen Is Nothing Then _RootAuswaehlen = New ViewModel.Instrastructure.RelayCommand(AddressOf RootAuswaehlen_Execute)
      420. Return _RootAuswaehlen
      421. End Get
      422. End Property
      423. Private Sub RootAuswaehlen_Execute(obj As Object)
      424. If RootIndex <> -1 Then AktuellerOrdner = RootVerzeichnisse(RootIndex).Pfad
      425. End Sub
      426. End Class


      Das Ganze gern erweitern, modifizieren und/oder verwenden (z.B. in einem modalen Dialog anzeigen) :)

      Oder euren Senf dazugeben :)

      Bei Fragen bitte melden.

      Edit: Hab noch ein paar Bugfixes gemacht, neuer Download siehe neuester Post.

      Und weils so schön war: Bis heute (09.01.2024) wurde das File 63 Mal heruntergeladen :-)
      Bilder
      • screenshot folderbrowser.png

        35,38 kB, 820×509, 147 mal angesehen

      Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „kafffee“ ()

      Erstmal ´n Kaffee und da nach downloaden

      Danke lieber @kafffee, werde es mir unter den Nagel reißen, weil keine Lust auf Service-Layer-Entwicklung und so ... Unbesehn jekoooft Keule.

      c.u. Joshi. Jetzt mit neuer Kaffeetasse vom 40zigstem der C`t. dort steht "Trendsetter seit den 80ern." Wie ich... :thumbsup:
      So, hiermit lade ich eine neue Version meines File- und Folderpickers hoch. Im Langzeittest haben sich nochmal 5-6 Bugs aufgetan die ich nun repariert hab.

      Es lohnt sich nochmal herunterzuladen, denn ein Bug war besonders fies:

      Als ich versehentlich versucht habe den Ordner C:\Users\<User>\Desktop umzubenennen ist zwar der Try-Catch-Block angesprungen, aber da war das Kind schon in den Brunnen gefallen: Meine Dateien und Ordner auf dem Desktop waren verschwunden. Ich konnte sie zum Glück wiederherstellen, indem ich im Windows Explorer die Ordner und Dateien gesucht habe (mit der Suchfunktion oben rechts), die auf dem Desktop waren, und sie dann aus der Suche wieder auf mein Desktop kopiert hab.

      Also nochmal viel Spass damit :)
      Dateien
      Könntest du das als GitHub-Repo hochladen?
      Dann kann man das viel besser in Projekte einbinden.

      Kann dir nachher sonst auch fix zeigen, wie das funktioniert. Wäre vielleicht sowieso mal eine gute Idee, hier im Forum ein Faden zu erstellen, wo Git mal erläutert wird, mit Tipps und Tricks.
      Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

      Meine Firma: Procyon Systems
      Meine Privatwebseite: SimonC.eu

      Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
      Ich versuche auf euch zurückzukommen :)
      Hoffentlich haste nicht nur die ZIP hochgeladen :D

      Einfach im OP den Link zu GitHub einfügen, über das Bearbeiten Button
      Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

      Meine Firma: Procyon Systems
      Meine Privatwebseite: SimonC.eu

      Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
      Ich versuche auf euch zurückzukommen :)
      Das wäre der richtige Link gewesen, ja. Das Repo hättest du aber als "Public" einstellen müssen :)
      Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

      Meine Firma: Procyon Systems
      Meine Privatwebseite: SimonC.eu

      Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
      Ich versuche auf euch zurückzukommen :)