Automatyczna zmiana wielkości kontrolek względem okna - WPF

0

Witam,
czy wie ktoś w jaki sposób można stworzyć automatyczną zmianę wielkości kontrolek przy zmianie wielkości okna w WPF?
Próbowałem znalezione sposoby w internecie takie jak:

VerticalAlignment="Stretch" 
HorizontalAlignmen="Stretch" 
i ustawienie marginesów

ale to doprowadza do rozciągania kontrolki i w przypadku dwóch kontrolek obok siebie, zaczynają na siebie nachodzić, a mi chodzi o proporcjonalną zmianę wielkości
np.

okno 1000x1000
przycisk 100x100
margines 100,100,0,0

przy zmianie okna

do 1200x1200
przycisk powinien mieć rozmiar 120x120
a margines 120,120,0,0

Pozdrawiam

1

Powinieneś zastosować Viewbox:
http://www.blackwasp.co.uk/WPFViewbox.aspx

0

Wielkie dzięki, działa tak jak należy :) Chciałbym wykorzystać jeszcze sytuacje i zapytać czy da się ustawić, żeby zwiększanie/zmniejszanie było możliwe tylko proporcjonalnie, np. z proporcji 16:9 (1280x720) okienka da się zmienić rozmiar do proporcjonalnie mniejszej/większej rozdzielczości (1366x768), a nie możliwe np. 1200x1200. Można by było po zmianie rozmiaru okienka (SizeChanged) sprawdzać wielkości i zmieniać wysokość/szerokość, ale ten sposób byłby kiepski. Lepiej by było jeśli użytkownik w czasie rzeczywistym widział jak może zmienić rozmiar okienka.

0

Dać się na pewno da WPF ma odpowiednie zdarzenia, dla mnie jednak taki efekt były irytujący. Niech proporcjonalnie zmienia się tylko zawartość okna (a ściślej pewnie chodzi Ci o jakąś jedną kontrolkę w tym oknie), a nie samo okno. Ale znowu bez kodu... ;)

0

No więc mam tak zdefiniowane okienko:

<Window x:Name="w_wy" 
        ...
        Title="Wyswietlanie" Height="720" Width="1280" WindowStartupLocation="CenterScreen" ResizeMode="CanResize" >
        <Viewbox HorizontalAlignment="Left" Stretch="Fill">
        ...

Dzięki Twoim podpowiedziom uzyskałem efekt jaki chciałem czyli 'eleganckie' dopasowywanie się kontrolek względem okna. Za co Ci bardzo dziękuje.
Jeśli chodzi o np. możliwość zmiany okienka do 16:9 to napisałem coś takiego:

        //obsługa zdarzenia zmiany rozmiaru okna
        private void w_wy_sizechanged(object sender, SizeChangedEventArgs e)
        {
            if (w_wy.Height != ((w_wy.Width * 9) / 16))
            {
                w_wy.Height = (w_wy.Width * 9) / 16;
            }
        }

Sposób ten spełnia swoje założenie, tylko przy przeciąganiu występuje milisekundowe mrygnięcie okienkiem. W sumie to nie przeszkadza, ale może istnieje jakiś lepszy sposób.
Pozdrawiam

0

Sposób ten spełnia swoje założenie, tylko przy przeciąganiu występuje milisekundowe mrygnięcie okienkiem. W sumie to nie przeszkadza, ale może istnieje jakiś lepszy sposób.

Problem jest w tym, że zdarzenie SizeChanged jak nazwa wskazuje, odbywa się PO zmianie rozmiaru okna. Czyli tak na prawdę ustawiamy sobie rozmiar 1200x1200, a i tak kod później zmienia to na proporcję 16:9, stąd mruganie (nie chodzi tutaj wcale o słynne DoubeBuffered z WinForms, które jest w WPF domyślnie!). Jak wspominałem, nie powinieneś tak robić - zamiast manipulacji oknem, powinieneś manipulować jego zawartością. Zresztą, sam sprawdziłem - nawet ViewBox dział domyślnie tak, że rozciąga zawartość proporcjonalnie. Jeżeli masz inaczej - prawdopodobnie źle stworzyłeś layout. Stworzenie dobrego layotu w WPF nie jest trudne, trzeba jednak znać podstawowe zasady oraz kontrolki i zachowania. Zamieść najlepiej kod+screeny co działa nie tak - jak mówię ustawianie proporcji okna to zło i amatorka.

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