TextBox z dostosowującą się wielkością liter w zależności od długości tekstu WPF

By | 26 lutego 2016

Problem z widokami jest taki, że nigdy nie jesteś w stanie przewidzieć jakie dane Ci się przytrafią, ale warto być na to przygotowanym. Dlatego właśnie stworzyłem prosty sposób na to jak zmusić TextBox do ustalania wielkości czcionki w zależności od ilości wolnego miejsca. Rozwiązanie jest najprostsze z możliwych, bo o to mi chodziło (na wielu stronach znalazłem rozwiązania zajmujące 50 linijek kodu, tylko po co?). Wystarczy dany TextBox umieścić w ViewBoxie, który po prostu będzie zmniejszał kontrolkę jeżeli jej wielość wzrośnie.

[csharp] <Grid>
<Viewbox>
<TextBlock TextWrapping="Wrap" Text="Some Text" />
</Viewbox>
</Grid>[/csharp]

One thought on “TextBox z dostosowującą się wielkością liter w zależności od długości tekstu WPF

  1. Kilka_uwag

    I znowu trochę uzupełnienia – Viewbox realizuje wzorzec projektowy dekorator – pozwala opakować klasę (a więc również kontrolkę) w inną – tzw. dekoratora. Klasa dekoratora może wpływać na wygląd ale nie musi* – przyjętą zasadą jest to, że metody dekoratora wywołują metody oryginalnej klasy i implementują dodatkowe funkcjonalności.

    Viewbox może posiadać jeden (i tylko jeden) element child (choć – jak to w WPF childem może być kontener, zawierający więcej obiektów) – nie tylko textview (tutaj warto wyjaśnić – klasa child jest klasą rozbudowywaną przez dekoratora).

    Choć domyślnie skaluje elementy w obu wymiarach, ale korzystając z właściwości Stretch (która jest typu System.Windows.Media.Stretch) możemy wpływać na sposób skalowania , np. zachowując proporcję wymiarów.
    Fajną rzeczą jest również to, że za pomocą właściwości StretchDirection (System.Windows.Controls.StretchDirection) możemy wpływać na to jaka akcja realizowana będzie przez Viewbox – np. tylko powiększanie bądź tylko pomniejszanie.

    To o czym jednak warto pamiętać to to, że stworzenie układu w Viewbox odbywa się przed skalowaniem. Dlatego jeśli wrzucimy w Viewbox kontrlolki obsługujące zawijanie, to to zawijanie zostanie usunięte. Nie jest to więc zawsze idealne rozwiązanie. Ale warto z niego korzystać.

    * – tutaj najlepszym przykładem jest np. rozbudowa możliwości struktur danych.
    Dociekliwi zauważą, że wzorzec dekoratora to pewnego rodzaju alternatywa dla dziedziczenia – przy zastosowaniu typów dynamicznych w C# daje to niesamowite możliwości – ale komentarz to nie dobre miejsce na bardziej rozbudowany przykład ;).

    Reply

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *