Návrh přihlašovacího formuláře - TextBox, PasswordBox, CheckBox a Label

10. díl - Návrh přihlašovacího formuláře - TextBox, PasswordBox, CheckBox a Label

Tomáš Jecha, MVP, MCSD       20.04.2012       C#, VB.NET, WPF, Komponenty, .NET       21654 zobrazení

Jak navrhnout jednoduchý přihlašovací formulář v technologii WPF. Zároveň popíši další čtyři ze základních komponent: TextBox, PasswordBox, CheckBox a Label.

Tento díl se věnuje několika novým komponentám (TextBox, PasswordBox, CheckBox a Label) na příkladu jednoduchého přihlašovacího formuláře.

Před samotným návrhem se krátce podíváme na smysl nově probíraných komponent.

TextBox

TextBox slouží jako vstupní komponenta pro zadávání neformátovaného textu. Hodí se na širokou škálu případů jako vstupní pole jednořádkového i víceřádkového textu. V našem formuláři bude sloužit pro zadávání uživatelského jména.

Má široké možnosti nastavování chování textu uvnitř sebe. Lze volit způsob zalamování (TextWrapping), povolovat posuvníku obsahu (VerticalScrollBarVisibility, HorizontalScrollBarVisibility) a také, zda je vůbec možné vložit nový řádek (AcceptsReturn). Samozřejmě podporuje nastavování velikosti a typu písma, což jsem popsal v minulém díle.

Hodnotu lze číst nebo nastavit vlastností Text.

TextBox

Na předchozím obrázku je defaultní nastavení TextBox komponenty pro jednořádkový vstup. Následující kód ukazuje, jak nastavit vlastnosti tak, aby bylo možné zadávat text s více řádky. Povoluje přidávání dalších řádků a aktivuje vertikální i horizontální posuvník:

<TextBox 
    HorizontalScrollBarVisibility="Visible" 
    VerticalScrollBarVisibility="Visible" 
    AcceptsReturn="True" />

image

Poznámka: Pokud povolíte zalamování (TextWrapping="Wrap"), docílíte stejné funkčnosti, jako volba v poznámkovém bloku “Zalamovat řádky”. Text tak nikdy nepřeteče na šířku TextBox.

PasswordBox

PasswordBox je funkčně podobný jako TextBox. Slouží ke skrytému zadávání hesla. Možnosti nastavení proti TextBox jsou pochopitelně omezené (nepotřebujeme řešit zalamování textu a podobně).

Hodnotu hesla lze číst nebo nastavit vlastností Password.

PasswordBox

CheckBox

CheckBox je jednoduchá vstupní komponenta, kterou lze vybrat jeden ze tří stavů (viz obrázek). Při běžné konfiguraci lze však volit pouze mezi možnostmi “Ano/Ne” (zaškrtnuto/nezaškrtnuto). Třetí stav je možné povolit vlastností IsThreeState = true.

CheckBox

Hodnotu lze číst nebo nastavit vlastností IsChecked. Ta může nabývat hodnotu true (zaškrtnuto), false (nezaškrtnuto) nebo případně null (ve Visual Basic Nothing; třetí stav).

Label

Label je pro mnoho lidí přecházejících z Windows Forms poněkud matoucí. Tam totiž slouží jako nejjednodušší komponenta pro zobrazení textu, o což  se ve WPF stará TextBlock. Label je proti tomu ve WPF většinou vnitřně stejně interpretován jako TextBlock. Což mimo jiné znamená, že je v případě, pokud chcete pouze zobrazit text, lepší použít přímo TextBlock.

V překladu Label znamená “popisek”. Konkrétně v případě WPF se jedná o popisek k libovolné jiné komponentě, kterou je možné aktivovat (přenést focus) klávesovou zkratkou Alt+[klávesa]. Ona konkrétní klávesa se označuje jako tzv. access key (přístupová klávesa) a my ji identifikujeme uvedením symbolu “_” (podtržítko) před požadovaný znak v textu popisku.

Následující kód ukazuje, jak vytvořit Label s popiskem “Ukázkový Label:” (písmeno “k” je access key), který odkazuje na TextBox vedle něj.

<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
    <Label Content="U_kázkový Label:" Target="{Binding ElementName=textBox1}" />
    <TextBox Width="200" Name="textBox1" />
</StackPanel>

Aby mohl Label fungovat, musí odkazovat na nějakou komponentu, kterou popisuje. K tomu slouží vlastnost Target. V příkladu jsem si cílový prvek pojmenoval vlastností Name jako “textBox1” a následně jsem použil výraz k vytvoření odkazu na pojmenovanou instanci komponenty:

{Binding ElementName=textBox1}

Použitý výraz nebudu nijak rozebírat, protože se výrazům budu věnovat v samostatných několika článcích.

Aplikace po stisknutí klávesy Alt zobrazí na všech elementech formuláře příslušné access keys a my tak jasně vidíme, že pro toto textové pole je klávesová zkratka Alt+k. Po jejím stisknutí se přenese focus na textové pole, což urychlí pohyb ve formuláři pomocí klávesnice.

Label WPF

Poznámka: Pokud chcete zobrazit v textu popisku podtržítko nepoužité jako access key, stačí jej zdvojit. Tedy “text_s_podtržítkem” zapište jako “text__s__podtržítkem”.

Návrh přihlašovacího formuláře

Nyní se vytvoříme jednoduchý formulář na přihlašování uživatelů. Funkčně nebude sice nic dělat, ale to v tuto chvíli není důležité. Bude vypadat takto:

Přihlašovací formulář

Při vytváření chceme chtít dosáhnout těchto výsledků:

  • Půjde zadat jméno uživatele, jeho heslo a bude k dispozici možnost zapamatovat přihlašovací údaje.
  • Klávesa Enter dialog potvrdí a klávesa Escape naopak dialog uzavře.
  • Klávesová zkratka Alt+… dovolí přeskočit na konkrétní pole.
  • Při spuštění aplikace je aktivní pole pro zadávání uživatelského jména.

Krok 1. – Hlavní rozložení formuláře

Máme založený nový projekt typu WPF Application.

Hlavnímu formuláři (MainWindow) můžeme nastavit nadpis a změnit barvu pozadí:

  • Nadpis: Title=”Přihlášení” 
  • Jako barvu pozadí jsem použil: Background="#FFE2E2E2"

Formulář dále rozdělíme do 3 základních částí (přesněji – řádků):

  1. Záhlaví – pro nadpis “Přihlášení k systému” – ten bude mít automatickou výšku podle svého obsahu.
  2. Obsah – tato část okna bude vyplňovat zbytek formuláře a bude se tak zvětšovat/zmenšovat při změně výšky celého formuláře.
  3. Zápatí – bude obsahovat tlačítka “Přihlásit” a “Storno” – stejně, jako záhlaví, bude mít výšku automatickou podle svého obsahu.

Výsledek může vypadat následovně (vložil jsem obarvené TextBlock elementy jako dočasnou výplň pro lepší představu):

image

Rozdělení na tyto řádky můžeme snadno provést elementem Grid:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <TextBlock Background="LightGreen" Text="Nadpis" FontSize="20" />
    <TextBlock Background="LightBlue" Text="Obsah" FontSize="20" Grid.Row="1" />
    <TextBlock Background="LightYellow" Text="Zápatí" FontSize="20" Grid.Row="2" />
</Grid>

Krok 2. – Nadpis a tlačítka v zápatí

V dalším kroku vyplníme první a poslední řádek. Nejprve nadpis:

<TextBlock Text="Přihlášení k systému" Margin="10" FontSize="20" />

Nadpis je tak větším písmem (velikost 20) a s odsazením 10 device-independent-pixels. Protože se jedná o první řádek Gridu (tedy index 0), nemusíme uvádět Grid.Row=”0”.

Dále vložíme tlačítka do spodní lišty. Seřazené budou vedle sebe a proto můžeme použít StackPanel:

<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Grid.Row="2">
    <Button Content="Přihlásit" Width="100" Margin="0 0 20 0" IsDefault="True" />
    <Button Content="Storno" Width="100" IsCancel="True" />
</StackPanel>

Nejprve jsem umístil StackPanel do spodního řádku (Grid.Row=”2”) a pro zarovnání k pravému okraji jsem nastavil HorizontalAlignment=”Right”.

Uvnitř StackPanelu se nachází tlačítka “Přihlásit” a “Storno”. Použil jsem u nich navíc tyto dvě vlastnosti:

  • IsDefault=”True” – označuje tlačítko na formuláři jako defaultní, které bude stisknuto klávesou Enter
  • IsCancel=”True” – označuje tlačítko na formuláři jako storno, které bude stisknuto klávesou Escape

Jako drobnou kosmetickou úpravu jsem přidal jednomu z tlačítek odsazení pravého okraje (Margin=”0 0 20 0”). Díku tomu není na druhé tlačítko přímo nalepené, ale vytváří mezi sebou mezeru.

Formulář vypadá následovně. Všimněte si podbarveného defaultního tlačítka “Přihlásit”, které se vyvolá při stisknutí Enter.

Login window

Krok 3. – Layout vstupních ovládacích prvků

Nyní nás čeká vložení jednotlivých vstupních komponent pro jméno, heslo a potvrzení, zda přihlašovací údaje uložit.

Pro tento účel využijeme další vnořený Grid. Ten bude umístěný uvnitř prostředního řádku hlavního Gridu (Grid.Row=”1”).

Vnitřek rozdělíme na 3 řádky (pro každý vstup jeden) a 2 sloupce (první sloupec popis hodnoty a druhý na vstupní prvek). Sloupce budou na šířku nastavené poměrem 1:2, protože působí lépe, pokud je více místa pro vstupní prvky.

A nakonec celý Grid vycentrujeme vertikálně na střed vlastností VerticalAlignment=”Center”. Kód definice vypadá následovně:

<Grid Grid.Row="1" VerticalAlignment="Center">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="2*" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
</Grid>

Do Gridu následně přidáme popisky a jednotlivá pole:

<Label Content="_Uživatelské jméno:" VerticalAlignment="Center" Target="{Binding ElementName=txtUserName}" />
<Label Content="_Heslo:" Grid.Row="1" VerticalAlignment="Center" Target="{Binding ElementName=txtPassword}" />
<TextBox Grid.Column="1" Margin="10" Padding="4" Name="txtUserName" />
<PasswordBox Grid.Column="1" Grid.Row="1" Margin="10" Padding="4" Name="txtPassword" />
<CheckBox Content="_Zapamatovat přihlášení" Grid.Row="2" Grid.Column="1" Margin="10" Name="cbxRememberCredentials" />

Výsledek bude vypadat takto:

Login Form WPF

Vyzkoušejte si, že při stisknutí access keys se aktivují příslušné komponenty (Alt+U = uživatelské jméno, Alt+H = heslo, Alt+Z = zapamatovat přihlášení).

Krok 4. – Dolaďování, focus a funkční kód

Aktuální podoba formuláře má všechny prvky nalepené na okrajích. To můžeme snadno vyřešit nastavením vlastnosti okrajů Margin hlavnímu Gridu, který nese všechny komponenty na formuláři. Řekněme na hodnotu 10. Výsledek na následujícím obrázku je patrný.

Login Form WPF with margin

Dále bude vhodné zobrazit přihlašovací formulář na středu obrazovky, čehož dosáhneme pomocí vlastnosti: WindowStartupLocation="CenterScreen".

Také lze zamezit zvětšování nebo zmenšování formuláře pomocí vlastnosti ResizeMode="NoResize". Avšak pro testování můžete ponechat režim výchozí, tedy dovolující změnu velikosti.

Možná je matoucí, proč se připravoval dynamický layout, když bude zvětšování a zmenšování zakázané. První důvod je samozřejmě to, že považuji za důležité se dynamické pozicování naučit. A druhým důvodem je fakt, že formulář můžete někdy potřebovat předělávat. A čím větší je, tím hůře se upravuje, pokud je layout absolutně pozicovaný. Představte si, že máte svoji komponentu použitou na 50ti místech v aplikaci. Změnit její velikost v případě absolutního pozicování znamená upravit všech 50 míst, kde se nachází. Oproti tomu u dynamického pozicování máte nemalou šanci, že velká část vaší aplikace nebude manuální úpravy vůbec potřebovat, protože pozicování nepočítalo s fixní velikostí komponenty.

Dále chceme, aby aplikace při spuštění měla kurzor připravený v poli zadávání uživatelského jména. Toho lze docílit nastavením výchozího prvku do vlastnosti “FocusManager.FocusedElement” nad celým formulářem, kde uvedeme odkaz na vstupní pole pomocí výrazu podobně, jako je tomu u Label komponenty:

FocusManager.FocusedElement="{Binding ElementName=txtUserName}"

Jako finální úpravu můžeme přidat do tlačítek nějaký funkční kód, abychom ověřili funkčnost kláves Enter a Escape. Do tlačítka “Storno” vložte kód pro ukončení aplikace:

Application.Current.Shutdown();

A do tlačítka “Přihlásit” kód pro zobrazení informativní zprávy:

MessageBox.Show("Přihlášení.");

Nyní by okno mělo splňovat všechny původní požadavky.

WPF Login - finální podoba

Pro úplnost uvádím i kód celého okna. Pokud jej budete kopírovat, nezapomeňte přejmenovat jméno třídy (x:Class vlastnost úplně na začátku), pokud se váš projekt jmenuje jinak, než WpfApplication1.

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Přihlášení" Height="312" Width="525"
        FocusManager.FocusedElement="{Binding ElementName=txtUserName}" Background="#FFE2E2E2"
        ResizeMode="NoResize"
        WindowStartupLocation="CenterScreen"
        >
    <Grid Margin="10">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <TextBlock Text="Přihlášení k systému" Margin="10" FontSize="20" />
        <Grid Grid.Row="1" VerticalAlignment="Center">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="2*" />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <Label Content="_Uživatelské jméno:" VerticalAlignment="Center" Target="{Binding ElementName=txtUserName}" />
            <Label Content="_Heslo:" Grid.Row="1" VerticalAlignment="Center" Target="{Binding ElementName=txtPassword}" />
            <TextBox Grid.Column="1" Margin="10" Padding="4" Name="txtUserName" />
            <PasswordBox Grid.Column="1" Grid.Row="1" Margin="10" Padding="4" Name="txtPassword" />
            <CheckBox Content="_Zapamatovat přihlášení" Grid.Row="2" Grid.Column="1" Margin="10" Name="cbxRememberCredentials" />
        </Grid>
        <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Grid.Row="2">
            <Button Content="Přihlásit" Width="100" Margin="0 0 20 0" IsDefault="True" Click="Button_Click_2" />
            <Button Content="Storno" Width="100" IsCancel="True" Click="Button_Click_1" />
        </StackPanel>
    </Grid>
</Window>

Závěr

Tento díl by měl ověřit vaše znalosti z předchozích článků. Pokud budete mít jakékoliv konstruktivní připomínky nebo dotazy, neváhejte je vkládat do diskuse pod článkem.

 

hodnocení článku

2 bodů / 2 hlasů       Hodnotit mohou jen registrované uživatelé.

 

Všechny díly tohoto seriálu

10. Návrh přihlašovacího formuláře - TextBox, PasswordBox, CheckBox a Label 20.04.2012
9. ContentControl, Button a TextBlock 10.04.2012
8. Canvas, StackPanel, WrapPanel 22.03.2012
7. Grid 16.03.2012
6. Základy pozicování 23.02.2012
5. Device independent pixels 16.02.2012
4. Architektura a objektový model WPF 09.02.2012
3. Jazyk XAML 02.02.2012
2. Architektura WPF – Dispatcher 26.01.2012
1. Úvod do Windows Presentation Foundation (WPF) 19.01.2012

 

Mohlo by vás také zajímat

LINQ a Entity Framework - díl 3.: LINQ - Rozhraní Ienumerable, iqueryable a yield return

Jednoduchý scheduler v .NETu

Asi to znáte – máte nějaký složitější systém na zpracování velkého objemu dat a čas od času potřebujete vykovat nějakou automatizovanou údržbu – typicky smazat všechny položky starší než několika dní. Možností, jak toho dosáhnout, je hodně. Snažil jsem se vymyslet něco jednoduchého a efektivního.

Code First initializers a migrace - kompletní přehled

 

 

Nový příspěvek

 

Další díly

Zdravím,

má cenu sledovat to, nebo už jste se psaním skončil?

Je to super seriál a byla by škoda skončit na začátku :-)

Adam

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

Pokračování...?

Dobrý den, proč většina hezky rozjetých článků vždy jednoduše skončí? 2 roky "ticha" je docela dlouhá doba, bude tato série někdy pokračovat? Chtěl bych to vědět jen kvůli tomu, jestli má cenu toto vlákno dále sledovat. Předchozí díly jsou supr, byla by škoda to takhle zapíchnout.

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

Diskuse: TextBox, CheckBox

Dobrý den

Chtěl bych se zeptat zda-li se někdy svět dočká pokračování tutoriálu, je jediný z kterého sem alespoň něco pochopil.

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

Diskuse: TextBox, CheckBox

Dobrý den, úvodem přikládám kladnou reakci na Váš seriál.

Chtěl bych se zeptat, pochopil jsem správně, že je výhodné psát formulář přímo v xamlu? Je editor v něčem nevýhodný? Nebo jde o Vaši osobní zkušenost a zvyk. Vyžaduje to znalost všech těch objektů a jejich vlastností... Když pominu IntelliSense.

Jinak WPF se mi po přečtení Vašeho seriálu velice zalíbilo, jen se mi zdá, že Visual Studio není tak pružné jako při WinForms. Regenerace formuláře po jakékoliv změně v kódu je celkem dlouhá. Je to správný postřeh? Děkuji, Hranec.

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

Dobrý den,

hlavním důvodem proč nepoužívat návrhář je to, že nedokáže pracovat se všemi možnostmi WPF a nedokáže přehledně zobrazit všechna upřesňující nastavení. Je to víceméně stejný důvod, jako při opouštění vizuálních návrhářů u HTML. Neříkám, že je návrhář k ničemu (můžete ho například používat v kombinaci se XAML editorem), nicméně pokud budete pracovat s WPF častěji, stejně skončíte u psaní XAML kódu přímo, protože pak máte větší kontrolu nad tím, co děláte.

Co se týká "regenerace formuláře", tak nevím co tím myslíte. Píšete o času změny zobrazení vzhledu v editoru po úpravě kódu v XAML editoru?

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

add1

Děkuji za odpověď, psát přímo xaml je celkem sympatické, jen to chce asi cvik.

add2

Řekněme:

-mám formulář (i jednoduchý) ve wpf a k němu zdroj *.cs

-ve zdroji udělám nějakou změnu (třeba jen nadeklaruji proměnnou)

-zkompiluji F5

-zobrazím formulář a než se zregeneruje, tak to chvilku trvá. Píše to "Loading... Press ESC to cancel"

U WinForm to bylo hned. Není to nějak dlouhá doba (do dvou sekund), na druhou stranu učím se to a jde o velmi jednoduchý formulář. Mám obavu, že u rozsáhlejších projektů by to bylo obtěžující.

Mám Windows XP a Microsoft Visual C# 2010 Express.

Možná jde i o výkon počítače... Pokud jste to nepozoroval, pak to nemůže být nic hrozného.

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

Toto je způsobeno tím, že se vaše assembly nejdříve kompiluje a poté se komponenty zobrazí v návrháři. Nicméně většinu času kompilace nezabírá zpracování samotného formuláře, takže i při rozsáhlejších projektech by neměla doba kompilace stoupat příliš drasticky. Pokud by takový problém nastal (například 100+ formulářů), lze rozdělit komponenty do samostatných assembly. Velkou výhodu však vidím v tom, že kompilace není potřeba vždy. Při běžném návrhu WPF aplikací kompiluji až při vytváření nových komponent nebo testování.

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

Děkuji, nemám ambice tvořit megaprojekty, takže si myslím, že se s wpf srovnám. Důležité pro mě je hlavně to, že studium wpf není pro mě ztráta času. Neživím se programováním a ani nebudu. Je to spíš koníček, na který nemám moc času, tak bych se nerad ubíral špatným směrem.

Chystáte pokračování seriálu? Je to velmi čtivé, jako ostatně všechny Vaše příspěvky, které jsem doposud od Vás četl. Děkuji, Hranec.

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

Diskuse: TextBox, CheckBox

Jeste sem neprisel na to jak udelat Label jako tlacitko,

aby pri kliku na labelu se provedl click.

Priradit labelu funkci buttonu, stylovat sem se uz naucil ale ted

uz jen takovato malickost.

Predem diky za radu.

Dexxtter

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

Jen pro upřesnění - ve WPF používejte místo Labelu raději TextBlock. Label je jen container na objekty popisující nějaký element na formuláři. Textový popisek je sám o sobě jen TextBlock.

K vašemu problému - dělá se to obráceně. Buttonu změníte jeho control template (vlastnost Template) na obyčejný TextBlock. Chcete jen změnit vzhled tlačítka.

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

Chtel sem ho vyuzit jako tlacitko.

Jde mi o to pouzit text jako tlacitko jako je ve webu hypertextovy odkaz.

Myslel sem ze bude nejlepsi pouzit label a zmenit mu vlastnost na

button, takze ted nevim co je spavne, nebo nejlepsi.

Protoze kdyz pouziju button s vlastnosti textBlock nebude text ve vzhleu klasickeho textboxu tedy oramovany text coz nechci.

zde je nahled tlacitek jak sem to myslel.

http://datastore.addat.cz/web/test/obr.j...

Poradte prosim.

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

Řešení, které jsem vám psal jsem správné. První si přečtěte něco o control templates. Řešení, které tu ale píšete vy, jsou absolutně mimo koncept WPF a účel jmenovaných komponent. Zajímalo by mě, jak jste k nim přišel.

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

OK. vyzkousim to.

Mate na mysli pouzivat text jako tlacitko, ze je mimo koncept wpf?

Hlavne mi doslo ze textbox neni to same co textBlock,

v tom je jadro pudla.

Takze jdu zkouset.

Diky.

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

Mimo jiné. Použijte tlačítko jako tlačítko, kterému jen změníte vzhled. Ne naopak, to nedává smysl.

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

Uz se mi to povedlo, sel jsem na to ze spatnyho uhlu:)

Potreboval sem nakopnout.

Diky za radu.

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

Diskuse: TextBox, CheckBox

Prosím vás, budu ešte vychádzať ďalšie diely? Za odpoveď pekne ďakujem!

Sp

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

Rád bych další vydal hned jak budu mít chvíli čas.

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

taky se těším na další :)

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

Děkuji za skvělý seriál.. Doufám, že bude pokračovat. =)

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

Diskuse: TextBox, CheckBox

Tiez sa pridavam, aby ste nahodou nemali pocit, ze clanok pisete pre seba :)

Skvely clanok a tesim sa na dalsie diely :)

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

Diskuse: TextBox, CheckBox

Dobrý den,

nejprve bych rád poděkoval za velmi pěkně napsané přínosné články.

Dále bych se rád zeptal, do jakých podrobností budou sahat články budoucí, zajímalo by mě např. dynamické přidávání obsahu, záludnosti wpf vs. silverlight, změna xaml vlastností z kódu vb/cs atp.

Díky

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

Dobrý den,

způsob ovládání z kódu budu probírat. V tuto chvíli se ještě několik článků budu věnovat návrhu UI a používání komponent. Pak proberu to, jakým způsobem vše vnitřně funguje a jak pracovat s objektovým modelem WPF z kódu (což zahrnuje vlastnosti, binding, strom objektů atp.). Porovnání se Silverlightem pravděpodobně rozebírat nebudu. Možná na to napíšu samostatný článek.

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.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • 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