Mouse Enter event na celém UserControlu   zodpovězená otázka

VB.NET

Zdravím, udělal jsem si userControl na kterém mám nějaké panely, tlačítka atd. Potřeboval bych odchytávat události mouser enter a mouse leave na celém usercontrolu. Bohužel se mi to nedaří, protože události se spustí jen tam, kde na usercontrolu není žádná jiný komponenta. Pokud tam je panel a já na něj najedu myší, tak nastane pouze událost mouse enter toho panelu ale ne usercontrolu jako takového.

nevíte někdo jak inteligentně tyto 2 události odchytávat?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak momentálně mě napadá napojit událost MouseEnter a MouseLeave u všech ovládacích prvků na jediný handler, který by vyvolával příslušnou událost UserControlu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To mě taky napadlo, jenže to má pár úskalí.

Za prvé budu muset pořád hlídat, abych nezapomněl ten handler přidat pokaždý když do userControlu dám nějaký nový ovládací prvek.

A za druhé ten panel slouží hlavně k tomu, že ho umístím někam na formulář a budu do něj dávat další komponenty (buttony, textbox atd.) A tady by byl ten samý problém, musel bych každý ovládacího prvek napojit na ten handler, což mi příjde dost nešikovné. Ten userControl dělám právě proto, aby to vnitřně fungovalo tak jak má a já už nemusel požadovanou funkčnost dopisovat ve formuláři kam ho umístím.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jinak to ale bohužel nepůjde. První problém jde jednoduše vyřešit cyklem v konstruktoru UserControlu:

Public Class UserControl1
  Sub New()
    InitializeComponent()
    For Each ctrl As Control In Controls
      AddHandler ctrl.MouseEnter, AddressOf Controls_MouseEnter
    Next
  End Sub
  Private Sub Controls_MouseEnter(ByVal sender As Object, ByVal e As EventArgs)
    OnMouseEnter(e)
  End Sub
End Class

To zajistí, že pokud bude kdykoliv přidán další ovládací prvek v návrhovém režimu do UserControlu, automaticky se mu přiřadí handler na MouseEnter (pro zjednodušení jsem nedělal MouseLeave).

Problému číslo dvě nerozumím. UserControl je většinou skupina nějakých běžných ovládacích prvků, který se využívá na více místech v aplikaci a do kterého se již za běhu nic nepřidává. To by potom ztrácelo smysl.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Abych to uvedl na pravou míru. Za běhu se tam samozřejmě nic přidávat nebude. Tenhle userControl je možné si představit jako panel, na kterém je pár základních věci. Konkrétně tam je hlavička s popisem, image se špedlíkem pro zafixování panelu a hlavně vnitřní logika, která má na starosti případne zajíždění panelu a zobrazení záložky. Je to podobné panelům ve visual studiu, jen s tím rozdílem že tenhle je jednoduší. Je vždy někde přichycený (nemůže být plovoucí atd.)

Tělo samotného panelu je prázdné a neobsahuje žádný controly, protože tento userControl chci používat na různých místech svojí aplikace a to tak, že ho přidám na nějaký formulář a umístím na něj nějaké další controly (textboxy, labely atd.) Ty budou ale vždycky jiné, podle umístění usercontrolu v aplikaci. V podstatě jsem si jen udělal svůj kontejner s rozšířenou grafickou funkčností který chci využívat jako kontejner na různých místech.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak to je ale potom ten samý případ jako třeba obyčejný Panel nebo jiný kontejner - u něj taky nenastává MouseEnter globálně, ale lokálně na ovládacích prvcích v něm umístěných. Takže jde to udělat buď tak jak jsem psal výše, nebo použít WPF, kde je možné aby událost nastala nejdříve na mateřském kontejneru.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Náhodou jsem narazil ne podobný požadavek. Potřebuji, aby panel po odsunu myši nebo po ukončení editace v komponentách panelu po nastaveném intervalu změnil svoji velikost (někam se zmenšil).

Prvky v panelu jsou vytvářeny dynamicky, na každý je přidán příslušný handler (MouseEnter, MouseLeave, případně MouseMove). Panel má nasteveno AutoScroll=True a zde je právě kámen úrazu. Pokud se myš zastaví na posunovací liště , dojde k proběhnutí události Panel.MouseLeave, která povoluje zavření okna a okno se samo zavře i když uřivatel chce posouvat sebe víc.

Lze to nějak ošetřit ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

já bych zkusil dát všechny komponenty do jednoho panelu a tomuto panelu bych nastavil zmiňované vlastnosti ;-)

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback