Forum » Programiranje » [WPF] Routed Events
[WPF] Routed Events
Ciklamen ::
Pozdrav.
Tuhtam in tuhtam, pa nikakor ne morem ugotovit kako ti routed events delujejo.
Primer:
Imam User Control (čist navadn control s par label-i na njem) ki jih nalagam na wrap panel. Sedaj bi pa rad, da ko kliknem na kateri koli User Control, da se mi odpre novo okno kjer bi lahko "uredil" kar koli je v label-ih. In da naredim to, rabim (vsaj tako domnevam) routed event-e.
In sedaj mi ni čist jasno kje točno bi klical to funkcijo za urejanje?
Sedaj imam recimo Custom Control, User Control in Main Window
v Custom Control-u imam tole:
User Control:
V Main Window nimam nič, ker nimam pojma kako nadaljevati.
Ko kliknem na kater koli User Control se event proži (ko debuggam gre koda skozi).
Upam da je (vsaj do neke mere) dovolj razumljivo kaj bi rad.
Tuhtam in tuhtam, pa nikakor ne morem ugotovit kako ti routed events delujejo.
Primer:
Imam User Control (čist navadn control s par label-i na njem) ki jih nalagam na wrap panel. Sedaj bi pa rad, da ko kliknem na kateri koli User Control, da se mi odpre novo okno kjer bi lahko "uredil" kar koli je v label-ih. In da naredim to, rabim (vsaj tako domnevam) routed event-e.
In sedaj mi ni čist jasno kje točno bi klical to funkcijo za urejanje?
Sedaj imam recimo Custom Control, User Control in Main Window
v Custom Control-u imam tole:
public static readonly RoutedEvent selectEvent = EventManager.RegisterRoutedEvent("Selected", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(CustomControl1)); public event RoutedEventHandler Selected { add { AddHandler(selectEvent, value); } remove { RemoveHandler(selectEvent, value); } }
User Control:
void RaiseMyEvent() { RoutedEventArgs myEventArgs = new RoutedEventArgs(CustomControl1.selectEvent); RaiseEvent(myEventArgs); } protected override void OnMouseDown(MouseButtonEventArgs e) { RaiseMyEvent(); }
V Main Window nimam nič, ker nimam pojma kako nadaljevati.
Ko kliknem na kater koli User Control se event proži (ko debuggam gre koda skozi).
Upam da je (vsaj do neke mere) dovolj razumljivo kaj bi rad.
- End of the Post ->
sebastjan28 ::
Mislim, da v zgornjem primeru niti ne potrebuješ custom Routed Eventa. Dovolj bi bilo, da dodal enega izmed event handler-jev(npr. za mousedown). Na user control-i bi lahko nato dodal novi custom event, ki bi kot payload-u poslal samega sebe in se sprožil od clicku. Na glavni formi bi enoostavno poslušal za ta event. Alternativna rešitev bi bila, da namesto Eventa na user controli raješ dodaš IComand Dependency property, ki ga nato "bindaš".
So pa obe zgornji rešitvi relativno (pre)komompleksne. Jaz osebno bi tega problema(še posebej, če gre za kodo, ki bo šla kdaj v produkcijo in jo bo treba vzdrževati) malo drugače lotil in striktno sledil MVVM patternu.
Uporabil bi ListBox(ki je selector) in mu spremenil ItemContainerStyle tako, da bi namesto default StackPanel uporablal WrapPanel. Namesto usercontrole, bi vsebino dodal v ItemTemplate. Dodanim elementom, bi dodal ustrezen binding. Na drugi strani bi definiral novi custom objekt, ga napolnil s ustreznimi podatki in jih dodal v ObservableCollection. Vse kar nato potrebuješ, je to, da povežeš event s tvojim custom Commandom v ViewModelu. To zna narediti kup Frameworkom(Tipkaj EventToCommand v google - Blend in MvvmLight to definitivno delata)
Takšna osnovna rešitev ti ne-bi smela porabiti več kakor 2-3 ure dela.
So pa obe zgornji rešitvi relativno (pre)komompleksne. Jaz osebno bi tega problema(še posebej, če gre za kodo, ki bo šla kdaj v produkcijo in jo bo treba vzdrževati) malo drugače lotil in striktno sledil MVVM patternu.
Uporabil bi ListBox(ki je selector) in mu spremenil ItemContainerStyle tako, da bi namesto default StackPanel uporablal WrapPanel. Namesto usercontrole, bi vsebino dodal v ItemTemplate. Dodanim elementom, bi dodal ustrezen binding. Na drugi strani bi definiral novi custom objekt, ga napolnil s ustreznimi podatki in jih dodal v ObservableCollection. Vse kar nato potrebuješ, je to, da povežeš event s tvojim custom Commandom v ViewModelu. To zna narediti kup Frameworkom(Tipkaj EventToCommand v google - Blend in MvvmLight to definitivno delata)
Takšna osnovna rešitev ti ne-bi smela porabiti več kakor 2-3 ure dela.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | UserControl v Wrappanelu WPFOddelek: Programiranje | 1144 (966) | hurlimannxt |
» | [c#] ukaz radirkaOddelek: Programiranje | 1113 (906) | japol |
» | SilverlightOddelek: Programiranje | 1737 (1394) | hodor |
» | Koda kalkulatorja v MS visual C# 2008?Oddelek: Programiranje | 2972 (2309) | smukC |
» | Kalkulator-problemOddelek: Programiranje | 1343 (1276) | Tutankhamun |