Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Responsive design

[es] :: .NET :: WPF Programiranje :: Responsive design

Strane: 1 2

[ Pregleda: 10336 | Odgovora: 25 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

bsod17

Član broj: 331246
Poruke: 20
*.dynamic.sbb.rs.



Profil

icon Responsive design07.12.2015. u 16:19 - pre 101 meseci
Hteo bih da napravim WPF aplikaciju koja ima razlicit raspored kontrola u zavisnosti od velicine prozora.

Ukoliko MainWindow ima Width iznad, recimo 500, onda zelim da mi Grid bude 2x2, a ako je ispod 500 onda 4x1 (4 Row-a, 1 Column). Prvo sam napravio 2 Grid-a, jedan 2x2, drugi 4x1. Imam 4 razlicita UserControl-a, koji predstavljaju View deo MVVM-a. Mislio sam da koristim VisualStateManager sa jednom grupom koja ima 2 state-a, jedan za defaultGrid, drugi za narrowGrid. Prvi state stavlja Visibility prvog Grid-a na Visible, a drugog na Collapsed, a drugi state obrnuto. GoToElementState sam stavio u handler za SizeChanged event. Ovo sam video u nekoj knjizi, samo tu nisu koristili UserControl, nego su kopirali sve kontrole iz prvog Grid-a u drugi i izmenili Row i Column vrednosti. Mislio sam da je nekako moguce da 2 razlicita Grid-a dele jedan isti UserControl (to je jedini razlog zasto sam svih desetak kontrola/elemenata i stavio u 4 UserControl-a), ali to izgleda nije moguce. E sad, za neke kontrole mi ne smeta sto tehnicki imam po 2 razlicite instance za svaki UserControl jer su zbog bind-ovanja "sinhronizovane", ali ako kucam nesto u textbox-u i promenim velicinu prozora/state, onda u "tom istom" textboxu nemam taj text koji sam ukucao.
Dosao sam do toga da mi VisualStateManager uopste ne treba, i da mi ne treba nijedan Grid osim root Grid-a. U handler-u za SizeChanged sam stavio da je rootGrid u zavisnosti od velicine prozora ili 2x2 ili 4x1, a za svaku UserControl instancu da prema tome menja svoje Row i Column vrednosti, tako da uvek imam samo 4 UserControl instance, koje samo menjaju mesto u aplikaciji.

Zanima me da li postoji neki bolji/elegantniji/vec utvrdjen nacin kako bi ovo trebalo uraditi?
Palo mi je na pamet i da napravim samo 2 UserControl-a, 2 View-a, a preko VisualStateManager-a da ih prikazem. I jedan i drugi View bi bind-ovali iste property-je ViewModel-a. "Sinhronizaciju" unetog teksta u textbox ili selektovanog itema comboBox-a bih onda uradio tako sto bih, recimo za textbox, Text property jednog View-a bind-ovao za Text property textboxa-a drugog View-a. Ali ovo mi se ne cini kao bolja alternativa.

Btw. koristim C#, VS 2013 i Windows 7.




[Ovu poruku je menjao bsod17 dana 07.12.2015. u 17:56 GMT+1]
 
Odgovor na temu

Dusan Kondic
Programer
ZR "Parametar" Ljubovija
Ljubovija

Član broj: 49961
Poruke: 225
*.adsl-3.sezampro.rs.

Sajt: www.drinacoding.com


+14 Profil

icon Re: Responsive design07.12.2015. u 17:04 - pre 101 meseci
Rešenje je po meni korektno.
Jednostavnije može da se izvede upotrebom Wrap panela, ali tada bi ti se pojavljivao i slučaj tri kontrole u jednom redu i jedne kontrole u drugom redu.
Pozdrav
 
Odgovor na temu

bsod17

Član broj: 331246
Poruke: 20
*.dynamic.sbb.rs.



Profil

icon Re: Responsive design07.12.2015. u 17:43 - pre 101 meseci
Da, upravo zbog toga nisam hteo WrapPanel da koristim. Samo nisam znao da li vec postoji u WPF-u neki opste prihvaceni nacin pravljenja responsive dizajna. Pretpostavljam da WPF aplikacije i ne treba da budu toliko responsive kao UWP, ali nisam se jos prebacio na njih.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6041



+4631 Profil

icon Re: Responsive design07.12.2015. u 18:05 - pre 101 meseci
Sve sto UWP ima je manje vise maznuo od WPFa

Btw, za ovo sto ti hoces da uradis najbolje resenje je UniformGrid, promenom rows/cols autoamtski rearangujes child elemente bez potrebe da ih sam pretumbavas po koordinatama.

A ako bas hoces da ovo napravis da bude WPF/MVVM koser, onda napravis attached behavior za UnfirmGrid koji prati promene rezolucija I sam podesava col/rows za tebe. Onda su tvoj view i view model cisti kao suza (posto sada trenutno imas event u view modelu koji menja view, sto nije bas u MVVM filozofiji).



Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

bsod17

Član broj: 331246
Poruke: 20
*.dynamic.sbb.rs.



Profil

icon Re: Responsive design07.12.2015. u 19:03 - pre 101 meseci
Event mi je u MainWindow.xaml.cs-u. Zar to spada u viewmodel?
A UniformGrid mi sam pravi raspored View-ova, ne mogu ja da biram gde hocu koji UserControl da stavim. Barem koliko sam video.
Ja hocu da imam sledeci raspored:

A B
C D

A ukoliko je manji prozor onda hocu:

B
A
C
D

A koliko sam video UniformGrid uvek istim redosledom slaze elemente. Nisam video da ima neki "fine-tuning".
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6041



+4631 Profil

icon Re: Responsive design07.12.2015. u 19:21 - pre 101 meseci
ViewModel ne treba da ima reference view elemenata, a moras imati reference view elementa da bi na njega zakacio event I/ili direktno promenio property Ono, ako bas zelis da bude MVVM. Sto bi rekli, its frowned upon. Zato imamo binding, attached properties and behaviors. U nekoj teoriji i praksi rezon za to je da bi viewmodel bio testabilan bez potrebe da se instancira i odrzava sam view. A I generalno, debagovanje i odrzvanje je dosta lakse.

Sto se tice redosleda elemeanta, to je opet nesto sto mozes da promenis kroz behavior. UniformGrid renderuje elmenente redosledom kojim su u Children kolekciji, behavior treba samo da swapuje item[0] I item[1] pri promeni broja kolona/redova.

Zato se I zove behavior, odredjuje nestandardno ponasanje neke vizuelne kontrole na osnovu nekih spoljasnjih uticaja.

I btw, code behind klasa nije viewmodel. jedini dozvoljeni kod tu je viewmodel wiring.
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

bsod17

Član broj: 331246
Poruke: 20
*.dynamic.sbb.rs.



Profil

icon Re: Responsive design07.12.2015. u 20:22 - pre 101 meseci
Citat:
mmix: posto sada trenutno imas event u view modelu koji menja view, sto nije bas u MVVM filozofiji.

Ali event mi nije u viewmodelu, nego u code behind klasi, MainWindow.xaml.cs. U konstruktoru sam stavio this.SizeChanged += MainWindow_SizeChanged; i u MainWindow_SizeChanged mi je kod.

Znam da ViewModel ne bi trebalo da zna uopste za View, ali jel generalno ne bi trebalo uopste da imam event-ove u code behind klasama ako hocu cist MVVM? Imam nekoliko komandi u ViewModelu koje cu koristiti, ali cini mi se da za neke stvari nema smisla da pravim komandu da bih zamenio nesto sto bih inace uradio kroz event. E sad, nisam radio sa behaviors do sada pa ne znam trenutno sta sve mogu sa njima da uradim i kada da ih koristim. Konkretno, imam aplikaciju Recnik nemackog jezika i imam nekoliko Button-a sa a,o,u umault-ima kao Context. Kad se klikne na neko od tih dugmadi Context se ubacuje u TextBox u koji unosim reci. To sam prvobitno mislio da uradim kroz OnClick event jer mi nije imalo smisla da napravim komande u ViewModelu za tako nesto jer to su kontrole View-a i ViewModel ne treba da ima veze sa njima. Tako sam barem razmisljao.
Jel se behaviours definisu u code behind klasi, ViewModelu ili u posebnoj klasi koja ne spada ni u View ni u ViewModel (ni u Model), a onda kroz Xaml ih ubacujem u same kontrole koje ce ih koristiti? Procitacu malo vise sada o ovome, bzv i pitam zapravo :D

A nisam toliko upoznat sa UniformGrid-om. Jedan row mog grida mora imati height *, a ostali su Auto. ListBox mi ide u * Grid.Row i popunjava ceo 'kvadrat' u kom se nalazi bez obzira na velicinu prozora, a ostale kontrole ostaje kolike su. Ne znam da li ovako nesto moze i sa UniformGrid-om da se uradi.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6041



+4631 Profil

icon Re: Responsive design07.12.2015. u 20:52 - pre 101 meseci
Da, da bi bio cisti MVVM, nema eventova u code behind. To je jednostavno untestable code, potpuno potire samu poentu MVVMa (sto ce reci ako imas taj jedan, sto ne I dva, a gde su dva tu su i svi ostali). Jedino sto sme da bude u code behind je dve linije koda koje ce postaviti DataContext na Viewmodel, ukoliko koristis (a trebalo bi) View-first metodologiju.
Potrebna je odredjena mentalna disciplina (i izdrzljivost) za praktikovanje MVVMa. Ti si tek zagrebao po povrsini, cek da pocnes da zaista koristis attachable mehanizme i konvertore, i kad pocnes sa nekim ozbljnijim MVVM paketom sa Dependency Injection-om, kao Prism npr. Sve ce ti delovati potpuno naduvano i nepotrebno ali jeste potrebno. A to ces videti prvi put kad budes peglao bug ili prosirivao funkcionalnost.

Ne postoji komanda Vew-a, ako cuvas state (view state, view model, nazovi kako hoces), onda obesmisljavas poentu samog view modela. Opet, zasto onda viewmodel, napravi sve kao varijable u code-behind. Ili radi kako treba preko ViewModela, koristi binding i ICommand, imas two-way binding izmedju textbox-a i polja u viewmodelu gde cuvas rec za pretragu i samo promenis to polje i dignes property changed. Veoma prosto (ima cak mehanizama za auto-podizanje property changed eventa). Text box koji prati binding ce videti da je view model promenio kontekst i prikazace promenjenu rec.


Mislim da uniform grid nije customizable u tom pogledu on uvek deli svoje celije na 1*, tako da su sve uvek iste velicine. Pazi, nista tebe ne sprecava da napravis i behavior za obican grid, samo sto ce ti kod biti malo kompleksniji. A mozes ovaj behavior za UniformGrd da namestis da promeni sirinu svojih celija u visual tree-u (to doduse zahteva malo bolje poznavanje visual tree hijerarhije). Behavior kao dakav moze da ima svoje DependenyProperty-s koje mzoes da podesavas iz XAMLa.

Behavior je inace klasa sa strane, i u smislu MVVMa smatra se delom View layera.
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

bsod17

Član broj: 331246
Poruke: 20
*.dynamic.sbb.rs.



Profil

icon Re: Responsive design07.12.2015. u 21:31 - pre 101 meseci
Kad rekoh da imam komande u ViewModelu mislio sam na ICommand (RelayCommand Josh Smitha).
ViewModel mi jeste DataContext za View-ove.
Igrao sam se malo sa konvertorima, ali ofc samo za neki jednostavan binding.
Citao sam nesto malo o Prism-u, deluje zanimljivo.

Mislim da se necu sada petljati sa UniformGrid-om za ovo, jer mislim da bi mi bilo mnogo maltretiranja da promenim (ako bih uopste umeo) nacin na koji deli celije, a i besmisleno mi je to raditi kad vec imam Grid * i Auto za to.

A citam sad neke blogove za Attached Property & Attached Behaviors i izgleda mi bas zanimljivo. Verujem da cu to bas dosta koristiti kako budem napredovao.
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12846



+4783 Profil

icon Re: Responsive design07.12.2015. u 22:46 - pre 101 meseci
Citat:
mmix: ima cak mehanizama za auto-podizanje property changed eventa.

Imas neku preporuku?
 
Odgovor na temu

bsod17

Član broj: 331246
Poruke: 20
*.dynamic.sbb.rs.



Profil

icon Re: Responsive design07.12.2015. u 23:15 - pre 101 meseci
Zar nije mislio samo na ovo: Text property textboxa binduje klasu koja implementuje INotifyPropertyChanged, tj. binduje property koji raise-uje event i pored toga ima NotifyOnSourceUpdated=true?
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6041



+4631 Profil

icon Re: Responsive design07.12.2015. u 23:33 - pre 101 meseci
@bsod17, obicno view model implementira taj interface

@shadowed, Ima raznih resenja, ja sam npr pravio neki za sebe sa modifikovanim setterima, a na osnovu nekog treceg koji sam upceao na netu. Meni je bilo vazno da izbegnem petljanje sa stringovima u notifikacijama I da sve lepo bude strong typed I compile-checked.

Npr, definise se Bazna klasa za ViewModel NotifySetterObject (zakacen ceo sors)

Code (csharp):

    public class NotifySetterObject : INotifyPropertyChanged, INotifyPropertyChanging
    {
        public event PropertyChangedEventHandler PropertyChanged;
   
        public event PropertyChangingEventHandler PropertyChanging;

        protected void SetPropertyAndNotify<T>(ref T field, T value, params Expression<Func<object>>[] propertyExpression)
        {
            if (field == null ? value != null : !field.Equals(value))
            {
                foreach (var prop in propertyExpression)
                {
                    string propertyName = prop.ExtractPropertyName();
                    this.OnPropertyChanging(propertyName);
                }

                field = value;

                foreach (var prop in propertyExpression)
                {
                    string propertyName = prop.ExtractPropertyName();
                    this.OnPropertyChanged(propertyName);
                }
            }
     
            ...
        }
 



onda se setter definise kao npr ovo, pri cemo ovaj jedan setter podize event za dva propertija.:

Code (csharp):


    [Export(typeof(IAddPaymentViewModel))]
    [PartCreationPolicy(CreationPolicy.NonShared)]
    public class AddPaymentViewModel : NotifySetterObject, INavigationAware, IAddPaymentViewModel, IRegionMemberLifetime
    {


        /// <summary>
        /// Gets or sets the search criteria, matching claim payments' name by string, invokes search reload through change
        /// </summary>
        public string SearchCriteria
        {
            get
            {
                return this.searchCriteria;
            }
            set
            {
                this.SetPropertyAndNotify(ref this.searchCriteria, value, () => this.SearchCriteria, () => this.SearchResults);
            }
        }
 



Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
Prikačeni fajlovi
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6041



+4631 Profil

icon Re: Responsive design07.12.2015. u 23:44 - pre 101 meseci
Btw, NotifyOnSourceUpdated nije ono sto ti mislis, to je da Binding objekat podigne svoje SourceUpdated event. To se u MVVMu uglavnom ne koristi jer je Binding manje vise deklarativan i nema eventa u code-behind (a nema ni svrhe jer si ti taj koji menja propertije u ViewModelu ). Svaki binding koji je OneWay ili TwoWay koji se kreira proverava da li source ima INotifyPropertyChanged i ako ima zakaci se za njega i prati property za koji je bindovan. Sve je to transparentno za tebe.
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

bsod17

Član broj: 331246
Poruke: 20
*.dynamic.sbb.rs.



Profil

icon Re: Responsive design07.12.2015. u 23:57 - pre 101 meseci
Aha, ocigledno nisam znao sta NotifyOnSourceUpdated, ni NotifyOnTargeUpdated znaci. A zaboravih da ViewModel obicno implementira INotifyPropertyChanged. U ViewModelu imam ObservableCollection, tj. moju klasu, SortedObservableColleciton, a itemi koji se nalaze u toj kolekciji kod mene pripadaju klasi koja takodje implementira taj interfejs jer CollectionChanged je samo za add, remove i move, ne prijavljuje nista ako se menja property klase koja predstavlja item kolekcije.

A C# 6 ima nameof keyword. Pretpostavljam da je moguce: OnPropertyChanged(nameof(Something));
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6041



+4631 Profil

icon Re: Responsive design08.12.2015. u 00:04 - pre 101 meseci
ObservableCollection i ostali slicni su drugo, oni implementiraju INotifyCollectionChanged i item-based controle bindovane na njega prate taj interfejs i reaguju na promene u kolekciji (opet transparentno). Za property tog tipa na ViewModelu ti ne treba notifikacija osim ako u property ne stavljas novu instancu kolekcije. To onda moras da notifikujes da bi binder znao da u view kontroli zameni staru instancu kolekcije novom.

Da, moze da se koristi nameof, medjutim ja cu i dalje korsititi gornji pristup posto SetPropertyAndNotify ujedno i proverava da li se vrednost propertija zaista promenila i ako nije ne radi nista i ne poziva notifikacije. Sprecava multi-hit scenarije kad u isti property vise puta upises istu vrednost.
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

bsod17

Član broj: 331246
Poruke: 20
*.dynamic.sbb.rs.



Profil

icon Re: Responsive design08.12.2015. u 00:15 - pre 101 meseci
Meni se menja sama kolekcija tako sto ubacujem nove iteme i nekad izbacujem iteme, ali koliko sam video izmena property-ja samih itema se ne prijavljuje preko kolekcije. Kod mene ListBox je bind-ovao SortedObservableCollection<GermanWordTranslationPair>. GermanWordTranslationPair ima Word property, immutable, i Translation property. Translation setter ima OnPropertyChanged, ali vrednost se menja samo ukoliko nova vrednost nije ista kao trenutna. A ovo sto kazes multi-hit scenario, jel to mislis ako nekoliko razlicitih threadova pokusava u isto vreme da promeni property?
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12846



+4783 Profil

icon Re: Responsive design08.12.2015. u 07:46 - pre 101 meseci
@mmix, ja pomislio da si nasao neku foru da ne moras da diras nista u setter-u. Mislim, trebalo bi da ne moze, ali, hej, covek svakog dana nauci nesto novo :)
Mada, mozda sa Roslyn-om bude izvodljivo da se nabudzi da tokom kompajliranja ubacuje u setter okidanje event-a. Al' da ne odvlacim coveku temu previse :)
 
Odgovor na temu

lukeguy
Novi Sad

Član broj: 46545
Poruke: 470
82.117.210.*



+8 Profil

icon Re: Responsive design08.12.2015. u 08:17 - pre 101 meseci
Probaj ovo
https://github.com/Fody/PropertyChanged
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6041



+4631 Profil

icon Re: Responsive design08.12.2015. u 08:19 - pre 101 meseci
@Shadowed, postoji I to

PropertyChanged.Fody 1.50.3

Instaliras NuGet package I prefixujes klase sa [ImplementPropertyChanged]


@bsod17
Da, svi modeli koje koristis za bindovanje treba da implementiraju INotifyPropertyChanged

TO vec funkcionise preko nekih .NET Sistema, npr Linq2SQL klase ga imlpementiraju automatski, EF.NET tempaltes ga sadrze (preko ReportPropertyChanged), itd. I mozes da implementiras i u svojim klasama koje su elementi kolekcija I onda ce ti I te promene biti publikovane.


Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12846



+4783 Profil

icon Re: Responsive design08.12.2015. u 09:06 - pre 101 meseci
Ju, pa ovaj Fody svasta ima. Eto meni nove igracke
Zahvaljujem.
 
Odgovor na temu

[es] :: .NET :: WPF Programiranje :: Responsive design

Strane: 1 2

[ Pregleda: 10336 | Odgovora: 25 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.