/ / Ako vstavané ovládače WPF spravujú ich obsluhy udalostí pri priloženej udalosti? - WPF, udalosti, úniky pamäte

Ako vstavané ovládacie prvky WPF spravujú svojich spracovateľov udalostí na pripojenú udalosť? - wpf, udalosti, úniky pamäte

Viem, že keď zaregistrujete objekt k udalostiam pripojeným k myši, máte úniky pamäte. Preto musíte použiť Slabý vzorec.

Mám problém s týmto vzorcom: Ak ho chcete použiť, v XAML kóde nemôžete definovať svoj obslužný program.

Pre mňa to znamená, že každý takýto kód uniká:

<SomeControl Mouse.MouseDown="MyHandler" />

Pokiaľ neodstránite manipuláciu výslovne v kóde (A pochybujem, že to niekto urobí). Teraz je niečo, čomu nerozumiem:

<Button Click="MyHandler" />

Tento kód nejako používa niekde myš.Udalosť MouseDown zistí kliknutie na tlačidlo. S nejakým výskumom s reflektorom som zistil, že táto udalosť používa MouseDown z triedy UIElement. A keď čítam kód UIElement, nerozumiem: neexistuje žiadny WeakEventManager!

Môže mi niekto vysvetliť, ako UIElement prijíma udalosti z Mouse.MouseDown bez úniku?

odpovede:

7 pre odpoveď č. 1

Používanie bežných obslužných programov v XAML nevyžaduje slabé odkazy.

Čo robíte, je vytvorenie referencie pamäte medzi hlavným ovládacím prvkom a podradeným ovládacím prvkom obsiahnutým v tomto ovládacom prvku; ovládačom dieťaťa je v tomto prípade tlačidlo.

Ak niekto udržiava odkaz na akúkoľvek časť vizuálneho stromu pre hlavnú kontrolu, celý strom zostane v pamäti, pretože je spojený spolu (odkazy rodič / dieťa).

Teraz, ak sú všetky odkazy na tento stromPo odstránení nie je odkaz na udalosť medzi rodičom a dieťaťom (hlavný ovládací prvok a tlačidlo) významný, pretože tieto ovládacie prvky už boli prepojené prostredníctvom odkazov rodič / dieťa. Po odstránení všetkých externých referencií je možné túto kontrolu zhromaždiť.

Obslužné programy udalostí v rámci XAML vytvárajú iba interné odkazy na udalosti.

Pri externých klientoch musíte byť opatrnízaregistrujte sa na udalosti na ovládacom prvku, pretože vytvárate externý odkaz, ktorý udržiava kontrolu nažive, pokiaľ existuje spojenie a klient (pokiaľ to nie je slabý odkaz).

Vaša otázka sa týka priložených udalostí. Nezdá sa, že by existovala jasná dokumentácia o tom, či pripojené udalosti spôsobujú úniky pamäte. Vyzerá to, že ovládací prvok používateľského rozhrania, ktorý sa prihlási na odber udalosti, obsahuje odkazy na udalosť namiesto toho, aby sa obchádzali, ale predpokladám, že statická Objekt udalosti musí mať nejaký spôsob, ako upozorniť na to, že bol spustený. Zdá sa, že spoločnosť Microsoft prekvapivo absentuje.