Dynamiczne generowanie kontrolek

0

Cześć,
Robię pierwszy projekt w WPF i szukam sposobu na dynamiczne generowanie kontrolek. Niestety wszystko co znalazłem nie do końca spełnia moje oczekiwania.
Problem polega na tym, że chcę wygenerować przyciski z obrazkami, które wczytam folderu (załóżmy, że będzie ich 100). Oczywiście pobieranie plików i ich formatowanie jest zrobione zajmuje się jakaś tam klasa i teraz chcę przekazać pojedynczo obrazki do kontrolek (wizualnie to ma wyglądać jakby miniaturki obrazków były wyświetlane na każdej kontrolce).
Podpowiedziałby mi ktoś jak zrobić to zrobić żeby w kodzie z C# było to zrobione i przekazane do XAML?
Mniej więcej o takie coś mi chodzi:

for(int i = 0; i<100; i++)
{
//kod odpowiedzialny za tworzenie kontrolek
}

PS. przy okazji proszę o jakąś mała podpowiedź jak to rozmieścić np w 4 kolumnach?

Pozdrawiam

1

Zasadniczo najlepszą drogą, aby to zrobić w WPF jest... tego nie robić.

WPF opiera się o tzw. wiązanie danych (data binding), co w skrócie oznacza, że XAML jest w stanie zrobić takie rzeczy jak wygenerowanie potrzebnych ci rzeczy za ciebie - nie powinieneś się przejmować tworzeniem kontrolek, wystarczy, że dostarczysz do widoku dane. Możesz zrobić tak:

Stworzyć sobie klasę odpowiadającą twojemu obrazkowi:

class Thumbnail
{
    public string Path;
}

Stwórz sobie teraz kolekcję takich obrazków, na przykład List<Thumbnail>, a potem musisz ją przypisać jako ItemsSource jakiegoś czegoś, co ładnie ci je poukłada w liście - na przykład ListBox. myListBox.ItemsSource = GetListOfThumbnails();

To spowoduje już teraz, że dostajesz listę, w której masz dla każdego obrazka wynik jego ToString(). Wygląda to słabo, ale ListBox może mieć coś, co się nazywa ItemTemplate, co mówi mu, w jaki sposób ma wyświetlać swoje dzieci. Da się to skleić z UniformGrid w taki też sposób, że dostaniesz widok w kolumnach:

<ListBox ScrollViewer.VerticalScrollBarVisibility="Disabled" x:Name="thumbnails">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Button>
                <Image Source="{Binding Path}" Width="300" Height="300" Stretch="Uniform" />
            </Button>
        </DataTemplate>
    </ListBox.ItemTemplate>
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Columns="4" />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
</ListBox>

I masz coś takiego:

screenshot-20170114202337.png

Alternatywnie, WrapPanel zamiast UniformGrid, aby nie była stała liczba kolumn, ale żeby się dostosowywał do zawartości:
screenshot-20170114201719.png

Każdy z elementów ListBox jest przyciskiem o określonych wymiarach, który w środku ma obrazek pobierany z odpowiedniego pliku.

0

Jeżeli zaczynasz przygodę z WPF zainteresuj się koniecznie MVVM. Kolega wyżej wspomniał o wiązaniu co jest ważne. Wspomniane wiązanie jest ...związane z mvvm :)
Pozdrawiam :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1