Bezug auf WPF-FolderBrowser-Dialog, weitergehende Frage

  • WPF

Es gibt 32 Antworten in diesem Thema. Der letzte Beitrag () ist von asusdk.

    Bezug auf WPF-FolderBrowser-Dialog, weitergehende Frage

    Hi @ all,

    es hat zwar eigentlich mit dem FolderBrowserDialog zu tun, aber die Fragestellung ist hier dann doch eine ganz andere, daher der neue Thread,

    ich habe folgendes gefunden, was zumindest einwandfrei die Ordner auflistet, sogar mit LazyLoading, also im Prinzip (fast) alles was man braucht :

    xaml
    Spoiler anzeigen

    XML-Quellcode

    1. <Window x:Class="MainWindow"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    6. xmlns:local="clr-namespace:FolderBrowserTest"
    7. mc:Ignorable="d"
    8. Title="MainWindow" Height="450" Width="800">
    9. <Grid>
    10. <TreeView Name="trvStructure" TreeViewItem.Expanded="TreeViewItem_Expanded" Margin="10" />
    11. </Grid>
    12. </Window>



    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.IO
    3. Imports System.Windows
    4. Imports System.Windows.Controls
    5. Class MainWindow
    6. Public Sub New()
    7. InitializeComponent()
    8. Dim drives As DriveInfo() = DriveInfo.GetDrives()
    9. For Each driveInfo As DriveInfo In drives
    10. trvStructure.Items.Add(CreateTreeItem(driveInfo))
    11. Next
    12. End Sub
    13. Public Sub TreeViewItem_Expanded(ByVal sender As Object, ByVal e As RoutedEventArgs)
    14. Dim item As TreeViewItem = TryCast(e.Source, TreeViewItem)
    15. If (item.Items.Count = 1) AndAlso (TypeOf item.Items(0) Is String) Then
    16. item.Items.Clear()
    17. Dim expandedDir As DirectoryInfo = Nothing
    18. If TypeOf item.Tag Is DriveInfo Then expandedDir = (TryCast(item.Tag, DriveInfo)).RootDirectory
    19. If TypeOf item.Tag Is DirectoryInfo Then expandedDir = (TryCast(item.Tag, DirectoryInfo))
    20. Try
    21. For Each subDir As DirectoryInfo In expandedDir.GetDirectories()
    22. item.Items.Add(CreateTreeItem(subDir))
    23. Next
    24. Catch
    25. End Try
    26. End If
    27. End Sub
    28. Private Function CreateTreeItem(ByVal o As Object) As TreeViewItem
    29. Dim item As TreeViewItem = New TreeViewItem()
    30. item.Header = o.ToString()
    31. item.Tag = o
    32. item.Items.Add("Loading...")
    33. Return item
    34. End Function
    35. End Class


    nur fällt mir einfach kein Ansatz ein, wie ich jetzt noch auslesen kann welches Verzeichnis ausgewählt ist, hat hier evtl. jemand eine zündende Idee ?
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Hallo

    Da du noch auf viele andere Probleme stoßen wirst - welche du vermutlich nicht beheben wirst/kannst weil du einen fatalen Try/Catch Block im Code hast - würde ich dir empfehlen den Forms Dialog zu nehmen.
    Was spricht gegen diesen?

    Ansonsten kanst du mit .IsSelected ja abrufen ob ein Treeview-Knoten selektiert ist.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Den code habe ich von HIER dachte nun nciht das der problematisch ist. Naja ansich spricht nichts gegen den FormsDialog zumindest von meiner Seite her, aber cih dachte das Du das als Pfusch bezeichnen würdest, weshalb ich nach einer alternative suchte...
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

    asusdk schrieb:

    aber cih dachte das Du das als Pfusch bezeichnen würdest


    Würde mir nicht einfallen. Warum das Rad neu erfinden. Was anderes wäre es wenn du eine völlig andere Optik in deinem Programm haben willst. z.b. wie das dunkle Theme von VS. Wenn sich da plötzlich ein heller Dialog öffnet kommt das finde ich nicht so gut, aber wenn man einen eigenen Dialog Proggt das finde ich sollte man es richtig machen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    ok nur mal angenommen ich hätte gerne einen anders aussehenden Dialog, hättest du einen Ansatz wo / wie ich anfangen könnte ? Ich habe mir bereits das Beispiel von ErfinderDesRades und das von MichaHo angesehen, aber habe hier das typische Problem mit zuviel Code und zuviel aufteilung, aber evtl. hast du ja eine gute quelle die einen nicht gleich erschlägt ?

    Also im Prinzip eine Anleitung, wie ich ein schlichtes Treeview mit meinen Directorys füllen kann (idealerweise mit lazyloading) und an den gewählten Pfad drankomme ? Ich google mir dahingehend seit 3 tagen die Finger Wund, aber ich finde einfach nichts dazu...
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „asusdk“ ()

    asusdk schrieb:

    ch habe mir bereits das Beispiel von ErfinderDesRades und das von MichaHo angesehen, aber habe hier das typische Problem mit zuviel Code


    asusdk schrieb:

    evtl. hast du ja eine gute quelle die einen nicht gleich erschlägt ?

    Wie soll das funktionieren? Wenn die typischen funktionen alle gegeben sein sollen und es korrekt funktionieren soll erfordert dies nunmal Code. Idealerweise eben auch gut aufgeteilt mit Klassen und Fehlerbehandlung.
    Das ist nun mal so beim programmieren. Wir kommen immer an den selben Punkt. Du hast Angst vor "zu viel Code", willst aber mit ein paar Zeilen zum Mond fliegen.

    Achja, das ghet sogar - wenn du dir code "kaufst". z.b. DevExpressoder Telerik bieten alle Dialoge an welche man umgestalten kann und welche auch vorgefertigte Skins enthalten. Aber das kostet eben.
    Da nehme ich mir lieber die Zeit und versuche den Code zu verstehen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Da hast du vollkommen recht, nur habe ich Gestern den ganzen Tag versucht hinter den Code Von MichaHo zu steigen, allerdings scheiterte ich hier kläglich.

    Wie soll das funktionieren? Wenn die typischen funktionen alle gegeben sein sollen und es korrekt funktionieren soll erfordert dies nunmal Code


    Es muss ja nicht jede Funktionalität gegeben sein, ich benötige z.B. keine Icons, es muss kein neuer Ordner erstellbar sein, Startdirectory ist auch nicht notwendig, es reicht im endeffekt wirklich ein TreeView mit der Auflistung der Directorys und einer Textbox in welcher der endgültige Pfad steht.

    Ich habe nun zumindest eine Variante hinbekommen die das geforderte erfüllt, nur denke ich mal das dass "Erstellen des Pfades" wahrscheinlich sinnfrei gelöst ist ?

    Xaml
    Spoiler anzeigen

    XML-Quellcode

    1. <Window x:Class="MainWindow"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    6. xmlns:local="clr-namespace:FolderBrowserTest"
    7. mc:Ignorable="d"
    8. Title="MainWindow" Height="450" Width="800" DataContext="{Binding RelativeSource={RelativeSource Self}}">
    9. <Grid>
    10. <Grid.RowDefinitions>
    11. <RowDefinition Height="370*"/>
    12. <RowDefinition Height="49*"/>
    13. </Grid.RowDefinitions>
    14. <TreeView Name="trvStructure" TreeViewItem.Expanded="TreeViewItem_Expanded" Margin="10" TreeViewItem.Selected="TrvStructure_Selected"/>
    15. <TextBox Grid.Row="2" Text="{Binding SelectedTreeViewItem, Mode=OneWay , UpdateSourceTrigger=PropertyChanged}">
    16. </TextBox>
    17. </Grid>
    18. </Window>


    CodeBehind:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.ComponentModel
    3. Imports System.IO
    4. Imports System.Runtime.CompilerServices
    5. Imports System.Windows
    6. Imports System.Windows.Controls
    7. Class MainWindow
    8. Implements INotifyPropertyChanged
    9. Public Sub New()
    10. InitializeComponent()
    11. DataContext = Me.DataContext
    12. Dim drives As DriveInfo() = DriveInfo.GetDrives()
    13. For Each driveInfo As DriveInfo In drives
    14. trvStructure.Items.Add(CreateTreeItem(driveInfo))
    15. Next
    16. End Sub
    17. Private _selectedtreeviewitem As String
    18. Public Property SelectedTreeViewItem() As String
    19. Get
    20. Return _selectedtreeviewitem
    21. End Get
    22. Set(ByVal value As String)
    23. _selectedtreeviewitem = value
    24. RaisePropertyChanged("SelectedTreeViewItem")
    25. 'MessageBox.Show(SelectedTreeViewItem.ToString)
    26. End Set
    27. End Property
    28. Public Sub TreeViewItem_Expanded(ByVal sender As Object, ByVal e As RoutedEventArgs)
    29. Dim item As TreeViewItem = TryCast(e.Source, TreeViewItem)
    30. If (item.Items.Count = 1) AndAlso (TypeOf item.Items(0) Is String) Then
    31. item.Items.Clear()
    32. Dim expandedDir As DirectoryInfo = Nothing
    33. If TypeOf item.Tag Is DriveInfo Then expandedDir = (TryCast(item.Tag, DriveInfo)).RootDirectory
    34. If TypeOf item.Tag Is DirectoryInfo Then expandedDir = (TryCast(item.Tag, DirectoryInfo))
    35. Try
    36. For Each subDir As DirectoryInfo In expandedDir.GetDirectories()
    37. item.Items.Add(CreateTreeItem(subDir))
    38. Next
    39. Catch
    40. End Try
    41. End If
    42. End Sub
    43. Private Sub TrvStructure_Selected(sender As Object, e As RoutedEventArgs)
    44. Dim itm As TreeViewItem = TryCast(e.Source, TreeViewItem)
    45. Dim str As String = ""
    46. Dim StrList As New List(Of String)
    47. StrList.Add(itm.Header.ToString.Replace("\", ""))
    48. Do While itm.Parent IsNot Nothing AndAlso TypeOf (itm.Parent) Is TreeViewItem
    49. If itm.Parent IsNot Nothing AndAlso TypeOf (itm.Parent) Is TreeViewItem Then
    50. StrList.Add(CType(itm.Parent, TreeViewItem).Header.ToString.Replace("\", ""))
    51. itm = itm.Parent
    52. End If
    53. Loop
    54. For i As Integer = StrList.Count - 1 To 0 Step -1
    55. str = str & StrList.Item(i) & "\"
    56. Next
    57. If Len(str) > 3 Then
    58. SelectedTreeViewItem = Microsoft.VisualBasic.Left(str, Len(str) - 1)
    59. Else
    60. SelectedTreeViewItem = str
    61. End If
    62. End Sub
    63. Private Function CreateTreeItem(ByVal o As Object) As TreeViewItem
    64. Dim item As TreeViewItem = New TreeViewItem()
    65. item.Header = o.ToString()
    66. item.Tag = o
    67. item.Items.Add("Loading...")
    68. Return item
    69. End Function
    70. Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
    71. Protected Overridable Sub RaisePropertyChanged(<CallerMemberName> Optional ByVal prop As String = "")
    72. RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(prop))
    73. End Sub
    74. End Class
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Hi,
    ich hab Dir hier noch einmal eine komplett abgespeckte Variante erstellt.

    Es ist komplett ohne Code Behind (außer der DataContext) und ich finde, man blickt durch.
    Dateien
    • WPFTreeView00.zip

      (12,48 kB, 22 mal heruntergeladen, zuletzt: )
    "Hier könnte Ihre Werbung stehen..."
    Danke dir vielmals für die Mühe, werds jetzt erstmal nach vb Convertieren und dann nochmal ansehen, aber so was den ersten Überflug angeht, gehen unsere Meinungen hier wohl SEHR WEIT auseinander, durchblick ist anders ^^

    Nachtrag, wie befürchtet lässt es sich nicht gescheit Konvertieren, da irgendwelche "komischen" schreibweisen enthalten sind... (Screenshot´s) (DirectoryItemViewModel)

    Angemekerte Zeile 1:

    VB.NET-Quellcode

    1. Return ChildItems?.Count(Function(i) i IsNot Nothing) > 0


    Angemekerte Zeile 2:

    VB.NET-Quellcode

    1. childItems = New ObservableCollection(Of DirectoryItemViewModel)(childItems.[Select](Function(child) New DirectoryItemViewModel(child.FullPath, child.Type)))




    Spoiler anzeigen
    Schweregrad Code Beschreibung Projekt Datei Zeile Unterdrückungszustand
    Fehler BC30311 Der Wert vom Typ "ObservableCollection(Of DirectoryItemViewModel)" kann nicht in "List(Of DirectoryItem)" konvertiert werden. FolderBrowserTest2 C:\Users\demke1\source\repos\FolderBrowserTest2\FolderBrowserTest2\DirectoryItemViewModel.vb 105 Aktiv
    Fehler BC32016 '"Public Overloads ReadOnly Property Count As Integer" hat keine Parameter, und der Rückgabetyp kann nicht indiziert werden. FolderBrowserTest2 C:\Users\demke1\source\repos\FolderBrowserTest2\FolderBrowserTest2\DirectoryItemViewModel.vb 88 Aktiv
    Fehler XLS0414 Typ 'MainWindow' wurde nicht gefunden. Stellen Sie sicher, dass keine Assemblyreferenz fehlt, und dass alle referenzierten Assemblys erstellt wurden. FolderBrowserTest2 MainWindow.xaml 1




    Nachtrag:

    so jetzt ist nur noch folgendes fehlerhaft, den rest konnte ich Lösen (denk ich)

    VB.NET-Quellcode

    1. Private Sub Expand()
    2. If Type = DirectoryItemTypeEnum.File Then Return
    3. Dim childItems = FullPath.GetFolders()
    4. childItems = New ObservableCollection(Of DirectoryItemViewModel)(childItems.[Select](Function(child) New DirectoryItemViewModel(child.FullPath, child.Type)))
    5. End Sub


    Ich habe da jetzt ewig rumprobiert, ich finde keine Lösung, da ChildItems hier eine List(of DirectoryItem) ist aber eine Zeile später versucht wird eine ObservableCollection(of DirectoryItemViewModel) reinzupacken.....


    Bilder
    • Capture.JPG

      50,86 kB, 552×524, 29 mal angesehen
    • Capture2.JPG

      46,62 kB, 1.194×231, 29 mal angesehen
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „asusdk“ ()

    Ok, habs nach ettlichem rumprobieren rausbekommen, die Lokale kleingeschriebene Variable childItems hat dazwischen gepfuscht, gibt hier wohl noch ein Paar unteschiede zwischen VB und C#
    Gelöst hab ich es allerdings wohl leider falsch, da mir nun nur ein leerer TreeView angezeigt wird.

    Evtl. kann einer das in VB übersetzte Project angucken und mir sagen was ich verkackt hab ?
    Dateien
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Hi,
    auf den ersten Blick sehe ich keine groben Fehler.
    bedenke, das die Private Properties mit _beginnen, so auch _childitems, _fullPath und _type.

    beim Debuggen scheint es mir, als würde IsExpanded nicht zurück ins viewmodel gesetzt.
    Ich kann morgen erst schauen, das ich dir ein VB Projekt baue...
    "Hier könnte Ihre Werbung stehen..."
    @Micha, kannst / magst du mir beantworten (find nix dazu da man wahrscheinlich den Begriff dazu kennen muss) was das ? direkt hinter ChildItems in C# macht evtl. ist da die krux begraben

    laut dem Converter würde die Zeile nämlich lauten :

    VB.NET-Quellcode

    1. Return ChildItems?.Count(Function(i) i IsNot Nothing) > 0


    da ich mir darauf keinen Reim machen kann ging ich davon aus (wohl fälschlicherweise) das du hier nur Prüfst ob count über 0. daher verwende ich hier:

    VB.NET-Quellcode

    1. Return ChildItems.Count > 0


    was die einzige mir bewusste änderung meinerseits an der isExpanded Property ist, also wenn es an dieser liegt ist das Problem wohl in dieser Zeile

    Nachtrag, es könnte womöglich auch daran liegen, das man anscheinend in vb.Net 2 Listen nicht anhand des <> unterscheiden kann, hier habe ich dann auf isNot zurückgegriffen, was aber auch fehlerbehaftet sein könnte...


    Nachtrag2: habe gerade auch mehrfach mit deinem Sample gearbeitet in der Hoffnung das mir irgendetwas auffällt was ich falsch haben könnte, dabei ist mir aufgefallen das dein Sampel abstürzt wenn es auf einen Ordner keinen Zugriff erhält (kann man ja umgehen, wollte dir nur bescheid geben falls das Problemchen auch in deinem richtigen Projekt steckt)

    Und Nachtrag 3: Du scheint in deinem OnProperty Changed ein Invoke zu verwenden ? Was ich leider nicht in VB übersetzt bekomme, evtl. auch hier ein Problemchen ?
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „asusdk“ ()

    Hi,
    das ? Bedeutet in diesem Zusammenhang einen Null Operator.
    Bedeutet, wenn der Operand, also in dem Fall ChildItems Null ist, wird der Rest der hinter dem . Ist nicht mehr ausgewertet. Ist er nicht null, wird das, was nach dem . Folgt ausgewertet

    die Funktion wurde mit C# 6 eingeführt, keine Ahnung wie das pandon dazu in VB heißt.

    in C# gibt es einige ? Operatoren, kannst Du bei MS nachlesen.

    EDIT: vieölleicht noch als nähere Erklärung...

    C#-Quellcode

    1. ChildItems?.Count(i => i ! = null) > 0

    bedeutet:

    wenn ChildItems nicht null ist (also wenn es eine Liste gibt, dann führe .Count aus... in der Count, prüfe ob es Items in der Liste gibt, die nicht null sind. wenn das dann größer ist als 0, dann gibt true zurück, ansonsten gib false zurück.
    Die Prüfung auf null innerhalb der Count Funktion wird deshalb benötigt, weil die ChildItems IMMER mindestens 1 Item hat, nämlich 1, das null ist -> siehe ClearItems Methode. Das wird deswegen benötigt, damit der Expander im Treeview überhaupt erscheint, denn nur wenn man expanden kann, dann kann man auch abfragen ob expanded ist oder nicht.

    Wenn es diese Weise in VB nicht gibt, musst du folgendes prüfen:
    Ist Childitems Null (also gibt es überhaupt eine Liste)
    Gibt es keine, returne false
    Gibt es eine, prüfe ob die Liste mehr als 0 Item hat UND zähle nur die, die nicht null sind.
    ist beides nicht gegeben, gib true zurück ist nur eins von beiden gegeben, gib false zurück.

    Ich schaue mir das Projekt morgen nochmal an und baue dir die IsExpanded so ein das sie funktioniert.

    "Hier könnte Ihre Werbung stehen..."

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „MichaHo“ ()

    gesetzt dem Falle das ich dich richtig verstanden habe würde es (bei mir, andere kennen sicher eine "bessere" Schreibweise) so aussehen:

    VB.NET-Quellcode

    1. If ChildItems IsNot Nothing Then
    2. If Not ChildItems.Count > 0 AndAlso Not ChildItems.Contains(Nothing) Then
    3. Return True
    4. Else
    5. Return False
    6. End If
    7. Else
    8. Return False
    9. End If


    Er erkennt auch, wieviele Drives ich habe (sehe ich anhand der "Aufklapppfeile")(ging auch schon vor der anpassung) aber er erhält augenscheinlich keinerlei daten... da sind nur die Pfeile ohne namen usw.

    Danke das du dir die Mühe gibst =)
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    ok also die OriginalZeile:

    VB.NET-Quellcode

    1. Return ChildItems?.Count(Function(i) i IsNot Nothing) > 0


    mekert er bei Count an, da die ReadOnlyProperty Count - keine Parameter hat und der Rückgabetyp nicht indiziert werden kann (Falls diese fehlerbeschreibung hilft)

    also, IsExpanded darf dann true sein wenn ChildItems mehr als 0 items enthält wobei die Items, die Null sind nicht mitgezählt werden dürfen

    Ich wüsste nicht wie ich die einzelnen Items Ohne Schleife durchgehen könnte 8|
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Hm habs mit schleife versucht, verhält sich nicht anders als davor....



    VB.NET-Quellcode

    1. If ChildItems IsNot Nothing Then
    2. Dim tmp_ChildItems As New ObservableCollection(Of DirectoryItemViewModel)
    3. For Each itms As DirectoryItemViewModel In ChildItems
    4. If itms IsNot Nothing Then
    5. tmp_ChildItems.Add(itms)
    6. End If
    7. Next
    8. If tmp_ChildItems.Count > 0 Then
    9. Return True
    10. Else
    11. Return False
    12. End If
    13. Else
    14. Return False
    15. End If




    und mit deinem Tipp (er nimmt das so an *freu*)

    VB.NET-Quellcode

    1. Return ChildItems.Where(Function(i) i IsNot Nothing).Count > 0

    leider nach wie vor leer, irgendwie hab ich eher das gefühl das es an anderer Stelle hängt...

    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Hi,
    am Ende war es dann doch wie ich oben schon schrieb.

    VB.NET-Quellcode

    1. Return ChildItems.Where(Function(i) i IsNot Nothing).Count > 0


    Funktioniert genauso wie es soll


    EDIT: gerdae erst deinen Edit oben gesehen.
    Ich hänge das Projekt mal an, wie gesagt, funktioniert bei mir bestens
    Dateien
    "Hier könnte Ihre Werbung stehen..."

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „MichaHo“ ()