NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Jak na formulár, ktorý mení svoj obsah

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

Aktivity
Avatar
Štefan Kiss
Člen
Avatar
Štefan Kiss:18.3.2020 8:02

Dobrý deň, priatelia, mohli by ste mi poradiť ako vo vpf vyriešiť nasledovnú situáciu? Potrebujem urobiť aplikáciu, ktorá po štarte na obrazovke ponúkne niekoľko hlavných možností a po kliknutí na niektorú z nich ponúkne zasa ďalšie . Niečo ako keď máte u niektorých inštalátorov najprv ponuku "inštalovať, O produkte Skončiť" a ak kliknete na inštalovať zobrazí sa "Produkt, Manuál, Ovládače" a podobne. Technicky vzato teda potrebujem, aby sa po štarte objavili na obrazovke napr 4 labely ale po kliknutí na niektorý z nich zmizli a objavili sa napr iné 3 alebo celý textblock v závislosti od kontextu.

Zkusil jsem: Kedysi v Delphi som toto riešil proste tak, že som si všetky potrebné prvky pridal na formulár a potom ich len skrýval a zobrazoval. Vo VPF však neviem mať v xamli grid s tými prvými štyrmi labelmi a zároveň iný s ďalšími troma a dynamicky ich skrývať a zobrazovať. Vychádza mi to teda tak, že musím celý obsah formulára tvoriť za behu. V xamli mám teda teraz iba jeden grid, ktorý asi budem dynamicky naplňať obsahom:

<Window x:Class="Test­.MainWindow"
xmlns="http:/­/schemas.micro­soft.com/winfx/2006/xam­l/presentation"
xmlns:x="http­://schemas.mi­crosoft.com/win­fx/2006/xaml"
xmlns:d="http­://schemas.mi­crosoft.com/ex­pression/blen­d/2008"
xmlns:mc="htt­p://schemas.o­penxmlformats­.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Test"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800" WindowStartup­Location="Cen­terScreen" WindowState="Ma­ximized" KeyUp="KeyUpWindow" KeyDown="KeyDow­nWindow" >

<Grid Name="zakladGrid" Margin="15" HorizontalAlig­nment="Stretch" VerticalAlignmen­t="Stretch" />

</Window>

Tento grid by som teda mal dynamicky napĺňať a znova vyprázdňovať podľa toho, do akého bodu aplikácia prichádza. Začal som teda písať úvodnú obrazovku:

void VytvorUvodneOkno()
{
ColumnDefinition definiciaStlpca = new ColumnDefinition();
definiciaStlpca­.Width = ((GridLength)(Ty­peDescriptor.Get­Converter(type­of(GridLength))­.ConvertFromIn­variantString("0­.50*")));
zakladGrid.Co­lumnDefinition­s.Add(definici­aStlpca);
definiciaStlpca = new ColumnDefinition();
definiciaStlpca­.Width = ((GridLength)(Ty­peDescriptor.Get­Converter(type­of(GridLength))­.ConvertFromIn­variantString("0­.50*")));
zakladGrid.Co­lumnDefinition­s.Add(definici­aStlpca);
RowDefinition definiciaRiadka = new RowDefinition();
definiciaRiad­ka.Height = ((GridLength)(Ty­peDescriptor.Get­Converter(type­of(GridLength))­.ConvertFromIn­variantString("0­.30*")));
zakladGrid.Row­Definitions.Ad­d(definiciaRi­adka);
definiciaRiadka = new RowDefinition();
definiciaRiad­ka.Height = ((GridLength)(Ty­peDescriptor.Get­Converter(type­of(GridLength))­.ConvertFromIn­variantString("0­.30*")));
zakladGrid.Row­Definitions.Ad­d(definiciaRi­adka);
definiciaRiadka = new RowDefinition();
definiciaRiad­ka.Height = ((GridLength)(Ty­peDescriptor.Get­Converter(type­of(GridLength))­.ConvertFromIn­variantString("0­.30*")));
zakladGrid.Row­Definitions.Ad­d(definiciaRi­adka);

Label[] labels = new Label[3];
labels[0] = new Label();
labels[0].Content = "Prvá položka";
labels[0].Hori­zontalAlignment = HorizontalAlig­nment.Center;
}

Otázka teraz je, ako prvý label a potom samozrejme aj ďalšie umiestniť do vyššie vytvorených buniek v gride a potom ich zasa odstrániť.
Resp poradili by ste mi iný koncept?

Chci docílit: Celý problém je v tom že to nechcem riešiť novými oknami, ktoré sa otvárajú ale chcem, aby sa všetko dialo v jednom fyzickom okne, ktoré iba mení svoj obsah. Ideálne by bolo mať priamo v xamli pripravených viac "obrazoviek" a potom ich len do aktívneho formulára vkladať no to sa vo vpf asi nedá. Či? Budem vďačný za rady.

 
Odpovědět
18.3.2020 8:02
Avatar
Odpovídá na Štefan Kiss
Michal Štěpánek:18.3.2020 8:22

Koukáš na to zbytečně složitě, na zobrazování či skrývání tlačítek stačí mít v XAMLu třeba StackPanely, do nich dát tlačítka a v události tlačítka těm StackPanelům nastavovat Visibility=Co­llapsed nebo Visible. Stejně můžeš skrývat i samotná tlačítka, popř. i jiné komponenty, ale pokud jich potřebuješ "obsluhovat" víc najednou, je lepší si je seskupit do StackPanelů...

Editováno 18.3.2020 8:24
Nahoru Odpovědět
18.3.2020 8:22
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Štefan Kiss
Člen
Avatar
Štefan Kiss:18.3.2020 9:03

Ano to viem, ale ak si napríklad v xamli pripravím tri stackpanely so skupinami labelov či tlačidiel a budem ich skrývať a zobrazovať, tak sa mi budú zobrazovať iba v určitej časti obrazovky, nie? Ak urobím niečo takéto

<Grid>

<Grid.RowDefi­nitions>
<RowDefinition Height="0.3*"/>
<RowDefinition Height="0.3*"/>
<RowDefinition Height="0.3*"/>
</Grid.RowDefi­nitions>

<StackPanel Name="panel1" Grid.Row="0" > .... </StackPanel>
<StackPanel Name="panel2" Grid.Row="0" > .... </StackPanel>
<StackPanel Name="panel3" Grid.Row="0" > .... </StackPanel>
</grid>

Mám teda grid s troma riadkami a v každom je jeden stackpanel. Ale ak ich potom začnem zobrazovať, tak jedna obrazovka bude vyzerať tak, že celá ponuka bude v hornej časti obrazovky a zasa v inom bode aplikácie bude všetko v strede či dolu. Technicky by to samozrejme bolo velmi jednoduché riešenie len ako docieliť, aby sa mi každý ten panel zobrazil na celú obrazovku.

 
Nahoru Odpovědět
18.3.2020 9:03
Avatar
Štefan Kiss
Člen
Avatar
Štefan Kiss:18.3.2020 9:10

Oh samozrejme
<StackPanel Name="panel1" Grid.Row="0" > .... </StackPanel>
<StackPanel Name="panel2" Grid.Row="1" > .... </StackPanel>
<StackPanel Name="panel3" Grid.Row="2" > .... </StackPanel>

teda každý v inom riadku

 
Nahoru Odpovědět
18.3.2020 9:10
Avatar
Odpovídá na Štefan Kiss
Michal Štěpánek:18.3.2020 10:55

Můžeš mít vše ve stejném řádku, jen visibility budeš dávat "Collapsed", nikoliv "Hidden". Collapsed ti zaručí, že viditelná tlačítka budou vždy na stejném místě. Jen bych to celé obalil ještě jedním "celkovým" stackpanelem

<StackPanel Grid.Row="0" >
<StackPanel Name="panel1" > .... </StackPanel>
<StackPanel Name="panel2" Visibility="Collapsed" > .... </StackPanel>
<StackPanel Name="panel3" Visibility="Collapsed" > .... </StackPanel>
</StackPanel>
Editováno 18.3.2020 10:56
Nahoru Odpovědět
18.3.2020 10:55
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Štefan Kiss
Člen
Avatar
Štefan Kiss:9.4.2020 2:28

Dobrý deň, dovolím si ešte raz sa vrátiť k tejto téme a opýtať sa nasledovné: vyššie uvedené riešenie funguje veľmi dobre a je použiteľné v prípade, že má človek menej objektov, ktoré dá na jednu obrazovku do jedného xamlu napr do viacerých gridov či stackpanelov a potom ich zobrazuje a skrýva podľa potreby. Hodí sa to napr. pri rôznych menu a podmenu, kde sa po kliknutí napr. na nejaký label objavia dva iné či naopak zmiznú.
Ako ale korektne postupovať v prípade, že mám viac obrazoviek, ktoré chcem užívatelovi zobrazovať ale stále v jednom okne. Napríklad ako keď máte nejakého sprievodcu niečím, kde na prvej obrazovke sú určité objekty, tlačidlá, zoznamy checkboxy a ak kliknete na "ďalej" objaví sa iná obrazovka ale v tom istom okne. Asi by bolo nezmysel trieskať všetko do jedného xamlu. Aj by to bolo neprehladné aj čo do obsluhy nemusia jednotlivé obrazovky spolu nejako súvisieť. Ak si však urobím viac samostatných xamlov a teda aj tried, ktoré sú potomkami triedy Window, po vytvorení inštancie a zavolaní metódou show či showdialog sa okno zobrazí ako nové okno a neprekryje teda obsah hlavného okna programu. Ako toto možno riešiť? Teda tak aby boli jednotlivé obrazovky v samostatných xamloch a obslužných triedach, no nevytvárali vždy nové okno. Ďakujem.

 
Nahoru Odpovědět
9.4.2020 2:28
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 6 zpráv z 6.