[ anakin14 @ 05.08.2011. 15:12 ] @
imam poteskoca da prevedem neki moj programcic u WPF.

1) pozicija kontrole

u winformsu je lako

control.top = i
control.left = y

u WPF-u nikako ne uspevam

vidim da ima .margin i .padding property ali mi ne da da dodelim tj promenim vrednost.

2) u Winformsu


tableadapter.fill dataset.tabela

listbox.datasource = dataset.tabela
listbox.displaymember = "sifra"

mislio sam da je ekvivalent u WPF-u

listbox.datacontex = dataset.tabela
listbox.displaymemberpath = "sifra"

ali nece? sve sam nakon toga probao i nikako da u kodu dodelim binding (ne kroz XAML, to sam provalio jer datasource moze da se prevuce na kontrolu, ali meni treba u runtime-u)

i jos jedno pitanje...

nikako ne uspevam da sa mainwindow-a ugasim mainwindow a pozovem userform.
me.close
dim form1 as new userform1
userform1.show

ali on mi zatvori sve.
isto se desava i kada zovem drugi prozor

hvala puno!!!


Hvala puno!!!
[ Dusan Kondic @ 05.08.2011. 17:16 ] @
1) Pozicioniranje kontrola u WPF-u se bitno razlikuje od onog u WinForms-ima. Predlažem ti da odvojiš neko vreme i pročitaš malo o tome. U globalu, postoje nevizuelne kontrole (Grid, Stack panel, Dock panel, Canvas ...) koje služe da se u njih stavljaju, odnosno da se pomoću njih pozicioniraju vizuelne kontrole. Ovakav način ima svoje prednosti, a najveća (po mom mišljenju) je ta što omogućava da prilikom promene veličine prozora, kontrole unutar njega takođe automatski promene veličinu.
2) Primer popunjavanja ListBox-a
Code:

            Binding b = new Binding() { Source = dtRadniciObr };
            this.lstRadnici.SetBinding(ListBox.ItemsSourceProperty, b);
            this.lstRadnici.DisplayMemberPath = "ImeIPrezime";
            this.lstRadnici.SelectedValuePath = "Id";

gde je lstRadnici ListBox a dtRadniciObr DataTable.
[ anakin14 @ 05.08.2011. 17:49 ] @
1) naravno da hocu da proucim, samo ako bi mogao (ako znas naravno) da mi ostavis neki link, posto sam ja trazio i googla-o i nailazio sam samo na napredne primere... meni bi trebao neki clanak o pozicioniranju kontrolaza pocetnike.

hvala puno!!!
[ Shadowed @ 05.08.2011. 21:09 ] @
'Vako..
U WPF-u imas tri vrste kontrola: Content, Panel i Items. Ova poslednja nam sada nije od interesa.
Content kontrole su Button, TextBox, RadioButton itd. Dakle kontrole koje prikazuju neki sadrzaj i taj sadrzaj je u njihovom Content property-u. Mogu imati tu i druge kontrole ali samo jednu (koja moze biti panel koji sadrzi vise kontrola).
Panel kontrole su one koje sadrze jednu ili vise Content ili drugih panel controla.

E sad, za razliku od WinForms gde (u velikoj vecini slucajeva) kontrola odredjuje svoj polozaj i velicinu, u WPF-u to radi panel u kojem se nalazi. Panel ce pitati svaku kontrolu u njemu koju bi ona velicinu htela ali konacnu odluku donosi panel.

Mala digresija. U WPF-u postoji nesto sto se zove attached property. To je property koji jedan objekat nema sam po sebi nego mu neki drugi objekat "nametne". Ovo se dosta koristi kod panela. Oni nakace property-e koji su im potrebni na kontrole koje se nalaze u njima.

Panele je moguce praviti svojerucno, nasledjivanjem klase Panel i pisanjem koda koji odredjuje rasporedjivanje kontrola u njemu. Framework nam daje nekoliko vec gotovih: Canvas, Grid, Stack, Wrap... Svaki od njih sluzi za neku vrstu uredjivanja kontrola u njemu. Evo kratkog pregleda:

Canvas
Dodaje attached property-e kontrolama Canvas.Left, Canvas.Top i zadavanjem tih velicina se odredjuje pozicija kontrole. Ovo je vrlo slicno WinForms-u. Mislim da su prve verzije WPF-a imale po default-u Canvas panel kao root panel u prozoru dok je to sada Grid.

Stack
Slaze kontrole jednu uz drugu. Moze po horizontali ili po vertikali sto se odredjuje property-em Orientation (moz' biti Horizontal ili Vertical). Velicina mu se povecava zajedno sa sadrzajem.

Wrap
Kao StackPanel samo sto mu je zadata velicina a kontrole slaze dok mogu da stanu a onda prelazi u novi red (ili kolonu, zavisno da li je vertical ili horizontal).

Grid
Malo slozeniji od prethodnih. Mogu mu se definisati kolone i redovi pri cemu se sirina kolone, odnosno visina reda mogu zadati bilo fiksno bilo proporcionalno u odnosu na sirinu/visinu celog grida. Kontrole se rasporedjuju u gridu zadavanjem vrednosti attach-ovanim property-ima Grid.Row i Grid.Column. Takodje, moguce je zadati i property-e Grid.ColumnSpan i Grid.RowSpan kojima se moze zadati da kontrola prelazi u vise colona ili redova.


Binding kasnije :)
[ Dusan Kondic @ 06.08.2011. 08:00 ] @
Evo kratkog primera koji će ti pomoći da malo bolje razumeš pozicioniranje u WPF-u.
Kreiraj nov prozor (window). Podrazumevano program nudi Window veličine 300 x 300 koji u sebi ima Grid.
Code:
<Window x:Class="WpfApp.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="300" Width="300">
    <Grid>
        
    </Grid>
</Window>

U našem primeru ćemo želeti da unesemo dve Labele, dva TextBox-a i jedan Button. Da bi smo ovo uradili u Grid-u ćemo da kreiramo tri reda i dve kolone.
Da bi kreirao kolone u Grid unesi sledeći kod
Code:

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
        </Grid.ColumnDefinitions>
    </Grid>

Ako nisi već primetio, VS ti pomaže da lakše unosiš redove. Npr. Kada ukucaš "<Grid." IntelliSense će ti ponuditi razne opcije pa kada dođeš do željene, pritisni "TAB". Kada se željena reč dopuni, dodavanjem znaka ">" će se dodati kod koji zatvara čitav XML nod.
Dalje, da bi kreiralo tri reda, unesi
Code:

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
    </Grid>

Kontrole se dodaju u red iznad "</Grid>" (predzadnji) i treba im podesiti atribute tako da se zna gde se tačno nalaze (Grid.Column, Grid.Row). Ovi atributi predstavljaju indekse željenog reda i kolone pa je npr. prvi red Grid.Row="0".
Code:
<Label Name="lblIme" Grid.Column="0" Grid.Row="0" Content="Ime"></Label>

Postavili smo Labelu koja se zove lblIme u prvu kolonu i prvi red Grid-a, a u njoj se nalazi tekst "Ime" (kontejnerske kontrole mogu da sadrže i npr. druge kontrole kao što reče Shadowed; mogli smo u Labelu da stavimo TextBlock ali to ostavi za kasnije).
Kada dodamo ostale kontrole kod treba da izgleda ovako:
Code:
<Window x:Class="WpfApp.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Width="300">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <Label Name="lblIme" Grid.Column="0" Grid.Row="0" Content="Ime" Background="LightYellow"></Label>
        <TextBox Name="txtIme" Grid.Column="1" Grid.Row="0"  Background="LightCyan"></TextBox>
        <Label Name="lblPrezime" Grid.Column="0" Grid.Row="1" Content="Prezime" Background="LightYellow"></Label>
        <TextBox Name="txtPrezime" Grid.Column="1" Grid.Row="1"  Background="LightCyan"></TextBox>
        <Button Name="btnUnesi" Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="2" Content="_UNESI" Background="LightBlue"></Button>
    </Grid>
</Window>

Da bi se bolje videlo podesio sam i Background atribute.
Primeti još par detalja. Button sam stavio u prvu kolonu (Grid.Column="0") trećeg reda (Grid.Row="2") i rekao da zauzme dve kolone (Grid.ColumnSpan="2").
U tekst koji sadrži Button sam stavio underscore "_" koji znači da klik dugmeta može da se izvede sa Alt+U (zato što je underscore ispred slova "U").
Izbrisao sam Height atribut Window-a pa je VS prema visini unesenih kontrola automatski podesio visinu prozora. Ovde može da ti se desi da nekada greškom ne vidiš neki red jer mu je zbog automatike Height="0".
Toliko za početak. Ostalo ćeš naučiti.
Pozdrav
[ Shavgan @ 16.04.2012. 15:58 ] @
Prst gore za Dušana,, svaka čast za primjer i nekoliko osnovnih pojmova....Ako imaš vremena mogao bih nastaviti sa svojim mini tutorijalom, o narednoj temi mozes sam da nam predlažeš bitne stvari i činjenice koje treba usvojiti....Ja sam upravo prije par dana poceo citati i istrazivati WPF kao tehnologiju i jako mi se sviđa.. sad bih da malo čačkam i da napravim jednu aplikaciju koja je skoro urađena u WinForms, znaci da logiku (C#) ostavim (ili prilagodim po potrebi ) a da User Interface malo "obnovim"..

Hvala jos jednom ..pozz
[ Dusan Kondic @ 16.04.2012. 17:54 ] @
Hvala.
Trenutno radim na sopstvenom sajtu na kome bi trebalo da bude dosta primera. Pošto nisam siguran kada ću uspeti da završim isti, početnicima predlažem da potraže jednostavne primere sa bindovanjem i DataContext-om. Bind-ovanje je možda najzahvalnija novina u WPF-u.
Kratko objašnjenje:
Ako određeni prozor služi za ažuriranje podataka npr. o robi, u njemu najverovatnije imate DataTabelu sa selektovanom robom. Ovaj kontejner sa podacima ne mora da bude DataTable. Može biti List<T>, ili ObservableCollection<T>. Nije svejedno ;-). Ko ne zna zbog čega nije svejedno, neka odabere ono na šta je navikao. Ovaj "kontejner" postavite da bude DataContext tog prozora. Kada ste to uradili, ListView, ListBox ili DataGrid koji ste predvideli da vam prikazuje te podatke samo bind-ujete za DataContext i podaci će biti tu. Dodatno, kontrole koje vam pomažu da ažurirate podatke selektovanog reda, takođe možete da bind-ujete za određeno polje selektovanog reda. Na ovaj način nemate potrebu da pišete kod (npr. DataGrid_SelectionChanged()) koji bi vam prepisivao pojedinačne podatke u odgovarajuće kontrole (npr. txtSifra.Text = ((DataRowView)DataGrid.SelectedItem).Row[0].ToString(); txtNaziv.Text = ((DataRowView)DataGrid.SelectedItem).Row[1].ToString();). Taj posao se odrađuje automatski.
Za prebacivanje koda iz WinForms u WPF bi bilo dobro primeniti MVVM princip ali to nije za novajlije. Suština je u tome da se kod drži u jednoj klasi (ViewModel) a izgled (View) u drugoj tako da je takav entitet mnogo lakše testirati i ažurirati.
Pozdrav