Diskuze: C# kontrolka pro roztahovací panel
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 12 zpráv z 12.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Toto se mi příliš nelíbí. Vypadá to jenom jako nové okénko. Není to komponenta na formuláři, která může mít vlstnost Dock nastavenou na Right a mít v sobě další komponenty. Něco takového potřebuji, aby mi obsah té roztahovací komponenty mohl díky roztahování vytlačit obsah dalších komponent (které mají Dock nastaveno na fill). Nové okno by zdrojový kód spíše překrývalo. To mi nepřijde příliš příjemné.
Když jsem zkoušel svojí vlastní implementaci, tak po celém dni programování jsem zjistil, že to v žádném případě není triviální problém.
1. Měnit velikost komponenty za běhu programu nepodporují Winformy nijak
příjemně. Jediná možnost je změnit Size, což je struktura, která se
musí měnit celá. Někde jsem našel zmíňky o tom, že to pravděpodobně
není "clean" způsob, jak to dělat. Ale navrhovaný "clean" způsob byl zase
používání nalinkovaných unsafe metod posíláním zpráv kontrolkám.
Přiznám se, že jsem to příliš nepochopil:
http://stackoverflow.com/…l-at-runtime
2. Pokud nastavím, aby se update prováděl neustále na mousemove, tak i když nastavím panel na doublebuffered, tak mi nepříjemně bliká celý formulář. Nastavil jsem tedy, aby se update provedl jen jednou po puštění tlačítka myši.
3. Když dám Fill nové komponenty, kterou dám do mého valstního panelu, tak se mi moje zvýrazněná hrana panelu, stejně jako všechno ostatní, překryje.
4. Jaké bylo překvapení, že výsledný panel, který jsem si napsal, vlastně nemůžu vůbec použít. Pokud do něj dám nějakou komponentu a nastavím jí Dock na Fill, tak všechny eventy, které odchytával panel jsou nyní ignorovány, protože když se myš nachází nad panelem tak se odchytávají pouze eventy které jsou vyvolány to novou komponentou, kterou jsem do panelu umístil.
Takže můj panel je ošklivý a funguje pochybně a funguje pouze když je prázdný... Jediná možnost jak to obejít je pravděpodobně ta, že bych si vytvořil místo panelu vlastní roztahovací treeview a textbox... a další komponenty. Sice budu mít velké množstí opakujícího se kódu, ale v tuhle chvíli mi nic lepšího nenapadá.
Když v .NETu něco není, tak by ses měl zamyslet i nad tím, jestli to opravdu potřebuješ, protože je divné, že by tam něco užitečného chybělo a nedalo se to realizovat nějakým jiným způsobem přes existující funkcionalitu. Ale stát se to může.
Stejně jako Honza si myslím, že pokud tu funkčnost opravdu chceš, není složité si ji naprogramovat. Dej si to do nějakého panelu a tomu obsluž události pohybu myší a držení tlačítka tak, aby se dal roztahovat.
Jinak pokud chceš takovéhle obskurnosti, tak to máš lepší dělat ve WPF, WinForms je už jen z podstaty zastaralý.
Mám pocit, že si trochu protiřečíš. Není divné, že by tam něco důležitého chybělo, pokud je WinForms zastaralý. Projekt je už ale rozběhnutý ve Winforms a některé jeho důležité komponenty které musím použít mám jen pro winforms.
A musím se odkázat na svůj předchozí příspěvek. Je nemožné obloužit událost roztahování, protože kontainer jiných komponent pak ignoruje události, pokud jsou vyvolány nad těmito dalšími komponentami. Pokud dám na svůj upravený panel tlačítko, tak pokud nad talčítkem přejíždím myší, tak mousemove panelu se nikdy nezavolá.
Teď jsem narychlo vyzkoušel tuhle funkcionalitu dát rovnou TreeView, ale marně. Z nějakého důvodu, přesto, že mám nastaveno aby se událost odchytávala 10 pixelů od kraje se odchytává pouze jeden pixel od kraje. A navíc z nějakého důvodu úplně stejný kód, který roztahoval panel ten TreeView prostě neroztahuje.
Budu se muset zeptat vyučujícího. Problém je, že s ním musím řešit mnohem důležitější věci než jenom hloupé rozhraní.
Neprotiřečím, říkal jsem v .NETu, ne ve WinForms a v .NETu je WPF WPF už existuje hezkou chvilku,
nechci tu dělat chytrého, taky jsem na ně přešel až po dlouhé době a
pořád jsem to oddaloval, ale stavět teď na WF něco většího určitě
není dobrý nápad, ono vůbec dělat něco ve WF už nemá smysl.
Že se událost ignoruje uvnitř přes kontrolky by ti vadit nemělo, ne? Tobě jde jen o to, aby se zachytila u okraje a to jsem pochopil, že ti funguje.
To s tím TreeView nechápu. Roztahuj prostě panel a TreeView dej do toho panelu a nastav mu anchors. Vše udělej jen pro panely a do nich si dáš co chceš.
Já zase slyšel, že už ani to WPF neni jistý co se týče budoucnosti.
U okraje mi to funguje pouze pokud uvnitř nic není. Pokud uvnitř něco je a sahá to až po okraj, tak to tu událost pohltí. (respektive když jsem říkal, že mi to funguje, myslel jsem jenom když je panel prázdný, a to je jisté, že je mi naprosto k ničemu).
A musí to sahat až po okraj, to je celý ten důvod proč to dělám. Musí být uvnitř komponenta, co má nastaveno Dock na Fill, aby se roztahovala podle velikosti panelu. Pokud by ta komponenta uvntř měla pořád stejnou velikost, ať se panel roztahuje jak chce, postrádalo by to celé snažení smysl... plus až by se panel zmenšil tak, že by komponenta uvnitř sahala až po okraj, už by s panelem nešlo vůbec manipulovat.
Já zase slyšel, že už ani to WPF neni jistý co se týče budoucnosti.
Můžeš uvést zdroj informace?
Ještě je možnost použít toto: https://github.com/…ckpanelsuite ... skvělá věc pro
dokovaná okna ... zdroják si můžeš upravit dle svých potřeb ... jinak rozhodně bych uvažoval
přejít na wpf. Winform u větších projektů dokáže dost potrestat,
zvlášť při použití generických formulářů
Zobrazeno 12 zpráv z 12.