[ Orome @ 29.01.2016. 15:48 ] @
Pocinjem da ucim WPF, najvise me privukao zbog mogucnosti pravljenja aplikacije nezavisne od rezolucije. Ako mozete da mi pomognete savetima, primerima bilo cim sto imate kako se to postize u WPF? Pitam ovde jer je lakse pitati na nasem jeziku nekoga ko ima iskustva nego na engleskom.

Da doprinesem, na formu sam nalepio button na kom sam postavio poruku Hello World, u XAML delu button-a sam stavio HorizontalAlignment="Stretch" i VerticalAlignment="Stretch". Za formu sam ubacio iz nekog primera sa neta sledece Height="{Binding SystemParameters.PrimaryScreenHeight}" i Width="{Binding SystemParameters.PrimaryScreenWidth}".

Efekat je da kada pokrenem ekran i uhvatim za ivicu forme i menjam velicinu ekrana button menja velicinu, sto verovatno radi ovaj Stretch. Da li to znaci da bi mi Stretch na Horizontal/Vertical Alignment-u pomogao na svakoj kontroli? Pitanje je kako da obezbedim da bez obzira na rezoluciju ekrana moja forma pokrije recimo full screen, ili cetvrtinu ekrana, da to uradi prilikom load-a ekrana i prilagodi kontrole velicini forme proporcionalno.

Razumeo sam da je WPF resenje za ovaj problem, svaka pomoc je dobrodosla.
[ mmix @ 29.01.2016. 16:43 ] @
Ok, moras da zaboravis sve sto si znao o resizingu u winForms aplikacijama Po defaultu (osim ako kontejner ili sama kontrola ne forsiraju drugacije), kontrole u WPFu uvek zauzimaju maksimalan prostor u svom parent.

Dakle nije bilo potrebe da nalepis binding na Width/Height, dugme na formi (ako je samo dugme) ce zauzeti povrsinu forme.

U WPFu se resolution adaptacija postize tako sto su svi vizuelni elementi vektorski umesto bitmapirani. Tako da se bazicno promena velicine forme transponira hijerarhijski kroz vizuelno drvo koristeci u osnovi kontejnersku logiku i afine transformacije.
[ Orome @ 29.01.2016. 17:07 ] @
Sta znaci :
1.) kontrole u WPFu uvek zauzimaju maksimalan prostor u svom parent ?
2.) dugme na formi (ako je samo dugme) ce zauzeti povrsinu forme.

To da su vizuelni elementi vektorski to sam procitao i jasno mi je, i jasno je da to daje mogucnost resavanja problema sa rezolucijom.

Elem, nasao sam ovaj kod pa ako moze komentar.

<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300">
<Viewbox Stretch="Uniform">
<Grid Width="400" Height="300">
<Button Content="Button" Margin="16,8,0,0"
Width="104" Height="32"
HorizontalAlignment="Left"
VerticalAlignment="Top" />
<CheckBox Content="CheckBox" Margin="136,8,0,0"
Width="112" Height="24"
HorizontalAlignment="Left" VerticalAlignment="Top" />
</Grid>
</Viewbox>
</Window>

Sta ovde tacno omogucava takvo ponasanje kontrola da se Strech-uju? Ovde se postavlja HorizontalAlignment i VerticalAlignment za button ali nije Stretch kao u prethodnom primeru. Koliko shvatam definicija button-a i checkbox-a je u ViewBox Stretch-u i to omogucava prilagodjavanje rezoluciji. Sta znaci navedeni Width i Height za button kada se ce resize-ovati. I sta znaci ovo HorizontalAlignment="Left" i VerticalAlignment="Top". Da li su to dve stranice koje ostaju fiksne prilikom promene velicine?

Takodje primetio sam da je namesten Width i Height isti kao kod forme, znaci da je Grid upotrebljivi prostor na formi za kontrole i da sam istim velicinama sve stavio kao raspolozivo za kontrole, jesam li u pravu?
[ mmix @ 29.01.2016. 19:08 ] @
1 i 2. Znaci da ako kontrola nema postavljeno Widht i Height, prilagodjava se svom parentu. Npr:

Code (xml):

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" Title="Big button" Height="300" Width="600">
    <Button Content="Big ass button!!!"/>
</Window>
 


Daje ovo (I ovo kad se resizuje). Hijerarhijom takivh elemenata moze da se napravi lep fluidni interfejs bez ruznih praznina.




Sto se tice tvog primera:

1. Stretch="Uniform" je default za vecinu kontrola (ako ne sve)
2. Vertical i Horizontal alignment ima uticaja na pozicioniranje u parentu. Ovde to znaci da su zalepljeni za top/left grida.
3. Grid je besmislen kad ima samo jednu celiju.
4. Koriscenje margina za pozicioniranje je bad practice.

ne znam sta si hteo da postignes, mozda nesto kao ovo?

Code (xml):

<Window  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="400" Height="300">
    <Viewbox>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="1*"/>
                <ColumnDefinition Width="3*"/>
            </Grid.ColumnDefinitions>
            <Button Content="Button"  />
            <CheckBox Content="CheckBox" Grid.Column="1" />
        </Grid>
    </Viewbox>
</Window>
 

[ mmix @ 29.01.2016. 19:11 ] @
Isto imaj u vidu da ViewBox manje vise remeti normalan WPF rendering. TO je malo, kako bi rekli, prinudni resizing. Ja ga nigde ne koristim, vise volim da napravim neki fluidni interfejs koji ce sa promenom rezolucije omoguciti vecu radnu povrsinu bez povecavanja velicine slova.
[ Shadowed @ 29.01.2016. 20:29 ] @
Treba napomenuti da je u WPF-u panel taj koji odredjuje velicinu i poziciju kontrola koje su u njemu. To je vrlo bitna razlika u odnosu na WinForms.
Kontrola samo "kaze" kolika bi htela da bude ali panel odlucuje.
[ Orome @ 30.01.2016. 11:20 ] @
Ok, sad mi je jasnije. Medjutim, ako je default na vecini kontrola "Uniform" je li moje pitanje o proporcionalnoj velicini forme u odnosu na rezoluciju pogresno? Tipa 1/4 ekrana bez obzira na rezoluciju.

Sada tvojim primerom vidim da se button bez podesavanja icega pa i Width i Height resize-uje automatski time sto ja menjam velicinu forme. Da li to znaci da bi WPF aplikacija trebala default-no odgovoriti na zahtev aplikacije nezavisno od rezolucije ili za neke fine radove ipak ima programiranja ili barem podesavanja.

[ dusans @ 31.01.2016. 11:46 ] @
WPF po default-u koristi device independent pixels (px).
Da bi se izračunala gustina prikaza (dpi) uzima se native rezolucija!
i fizičke dimenzije display-a kao i dpi scaling settings iz podešavanja OS-a.
Ovako dobijena gustina se zaokružuje na približnu vrednost - efektivno na 72, 96, 120, 144, ... dpi i dalje korsiti kao takva.
Recimo, kod većine monitora koji su danas u upotrebi ova vrednost je 96 dpi (a matematički između 90 i 110).
Device independent pixel u WPF se definiše kao jedan fizički pixel na 96 dpi display-u.
Dakle:
Code:

1px na 96dpi = 1px fizički
96px na 96dpi = ~1inch fizički

1px na 120dpi = 1.25px fizički
96px na 120dpi = ~1inch fizički

1px na 144dpi = 1.5px fizički
96px na 144dpi = ~1inch fizički

Na ovoj slici je to lepo objašnjeno:

https://books.google.rs/books?...AA#v=onepage&q&f=false

E sad, odgovori na tvoje pitanje...

1. Nemoj koristiti ViewBox za skaliranje pošto nećeš moći da iskoristiš potencijalno raspoloživ prostor.
Elementi će ti biti nekada veći/nekada manji u odnosu na ostale aplikacije koje poštuju windows-ovu
dpi diskretizaciju i onda to može da izgleda ružno. Jednostavno, nećeš dobiti ono što bi želeo,
a i budeš ograničen na "krute" layout-e.

2. Koristi px kada zadaješ dimenzije da bi elementi lepo skalirali na različitim dpi display-a.
Videćeš da je ovo neobično/ne-štima ako promeniš rezoulciju sa native na recimo manju,
dobićeš fizički krupnije elemente (pošto se dpi ne menja, što je objašnjeno na slici).
Takvo ponašanje je by-design - sam windows GUI a i ostale aplikacije će biti krupnije, wpf prati tu filozofiju.
Po tom pitanju u principu nema potrebe da bilo šta menjaš ili doteruješ, tako je kako je.

3. Koristi grid-ove za osnovne delove layout-a putem kojih možeš relativno jednostavno da
okupiraš raspoloživi prostor. Auto/proporcionalne/fill dimenzije redova/kolona su bog i batina
kada govorimo o fleksibilnim layout-ima koji treba lepo da se fit-uju u rasploživ prostor.

4. Da li ćeš koristiti stretch ili zadavati dimenzije elementima, jednostavno zavisi od konkretnih
slučajeva i same filozovije vizuelnog dizajna koji si zamislio.
Kontejneri/paneli se češće strečuju a dugmadi/inputi češće dimenzionišu/aligniraju,
a na kraju ispravno je ono što je u konkretnom slučaju najbolje "leži".

Dakle, Wpf je već u određenoj meri (približno) resolution independent, na to dodati fleksibilan layout i to je to.


[Ovu poruku je menjao dusans dana 31.01.2016. u 12:57 GMT+1]