NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: WPF - Umístění do stackpanelu nezávisle na ostatních UIElementech

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

Aktivity
Avatar
Petr Šťastný
Tvůrce
Avatar
Petr Šťastný:28.5.2017 20:40

Zdravím, potýkám se s menším problémem.

Mám stackpanel o neznámé výšce a šířce. Poté mám n UIElementů (třeba Label), které chci umístit do StackPanelu. Chci je umístit pomocí kódu a to tak, aby to bylo vše na stejném místě při jakékoli velikosti stackpanelu (myšleno: třeba pořád ve třetině). Moc se mi to nechce dělat v Gridu, v pozdější fázi bych toho pravděpodobně musel hodně řešit a upravovat.

Udělal jsem toto:
Mám proměnné double pro každý UIElement. Tyto proměnné jsou čtyři, a to výška, šířka, vzdálenost odshora a zleva. Nabývají hodnot 0-1.
Původně jsem to dělal tak, že jsem nastavoval výšku, šířku a vzdálenosti závisle na velikosti StackPanelu, kam jsem je umisťoval, ale když jsem jich tam umístil víc, ovlivňovali se vzájemně. Tedy první byl 10% odshora od StackPanelu, ale druhý byl až 10% odshora od toho prvního, tedy asi 25% od stackpanelu. Kód:

// l - label
// height, width - rozmery stackpanelu
// percentage(cokoli) - zadane procentualni hodnoty

l.Height = height * percentageHeight;
l.Width = width * percentageWidth;

Thickness thickness = new Thickness();
thickness.Left = width * percentageXoffset;
thickness.Top = height * percentageYoffset;

l.Margin = thickness;

Jak to dopadlo můžete vidět na screenshotu -> do stackpanelu (toho ošklivého modrého) jsem dal dva labely se stejným nastavením. Měly by se dokonale překrývat.

Když jsem zkoušel nastavit maximální velikosti a upravit padding, narazil jsem na stejný problém.

Thickness thickness = new Thickness();
thickness.Left = width * percentageXoffset;
thickness.Top = height * percentageYoffset;


l.HorizontalAlignment = HorizontalAlignment.Stretch;
l.VerticalAlignment = VerticalAlignment.Stretch;
l.Padding = thickness;

Dopadlo to úplně stejně, jako minule.

Dále mě napadlo uložit souřadnice pro nějaké rozměry (třeba 100x100px) a potom to dopočítat na rozměry daného stackpanelu. Jenže jsem nenašel, jak udělat absolutní pozici, vše se točilo kolem canvasu, se kterým jsem ještě neměl tu čest pracovat a nejsem si jistý, jak by to šlo udělat v kódu.

Co tedy mám udělat? Problém by vyřešilo třeba to, kdyby někdo přišel na to, jak to udělat, aby se elementy navzájem neovlivňovali, aby se margin počítal jenom vzhledem k stackpanelu, ale jakákoli rada pomůže.

Budu rád za jakoukoli pomoc. Děkuji :)

 
Odpovědět
28.5.2017 20:40
Avatar
Odpovídá na Petr Šťastný
Patrik Valkovič:29.5.2017 0:36

Pokud nechceš, aby se elementy vzájemně ovlivňovali (chceš si je tedy umisťovat sám na určené souřadnice), bude nejlepší použít Canvas. Přesně k tomu je určen. Samozřejmě s Canvasem můžeš pracovat v kódu, jen nejde property nastavit přímo na objekt, ale musíž zavolat

label.SetProperty(Canvas.Left,100);
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
29.5.2017 0:36
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Petr Šťastný
Tvůrce
Avatar
Odpovídá na Patrik Valkovič
Petr Šťastný:30.5.2017 14:33

Funguje to, děkuji :-)

Kdyby ještě někdo měl podobný problém, doslova se to nastavuje takto:

l.SetValue(Canvas.LeftProperty, 200);
Editováno 30.5.2017 14:34
 
Nahoru Odpovědět
30.5.2017 14:33
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.