Jednorozměrné pole - WPF

Site: Moodle ZČU
Course: KPV/TI Technická informatika ve strojírenství - cvičení
Book: Jednorozměrné pole - WPF
Printed by: Gast
Date: Sunday, 8 November 2026, 5:20 PM

1. JednorozmernePoleWPF

Úkolem je vytvořit aplikaci, která by dovedla pro vektor celých čísel:

  • Naplnit vektor automaticky nulami
  • Naplnit vektor automaticky náhodnými hodnotami v zadaném rozsahu
  • Naplnit vektor implicitním cyklem jednotlivě zadávanými hodnotami pro zadaný index
  • Zobrazit vektor jako text oddělený čárkami
  • Zobrazit vektor do seznamu 1xN
  • Vypočítat minimum z hodnot vektoru
  • Vypočítat maximum z hodnot vektoru
  • Vypočítat průměr z hodnot vektoru
  • Seřadit vektor vzestupně podle velikosti prvků
Účel příkladu
  • Práce s jednorozměrným polem
Typ aplikace
  • WPF aplikace
Popis úkolu 
  • Základní operace s jednorozměrným polem
Funkčnosti
  • Při stisku tlačítka Náhodně se naplní vektor automaticky náhodnými hodnotami v zadaném rozsahu
  • Při stisku tlačítka Jednotlivě se naplní vektor implicitním cyklem jednotlivě zadávanými hodnotami pro zadaný index
  • Při stisku tlačítka Nulovat se naplní vektor automaticky nulami
  • Při stisku tlačítka Vektor jako text se zobrazí vektor jako text oddělený čárkami
  • Při stisku tlačítka Do mřížky se zobrazí vektor do seznamu
  • Při stisku tlačítka Minimum se zjistí minimum z hodnot vektoru a zobrazí se index minima
  • Při stisku tlačítka Maximum se zjistí maximum z hodnot vektoru a zobrazí se index maxima
  • Při stisku tlačítka Průměr se vypočítá průměr  z hodnot vektoru
  • Při stisku tlačítka Seřadit se seřadí vektor vzestupně podle velikosti prvků
  • Při stisku tlačítka Konec se provede zavření formuláře 
Výstup programu


Výstup programu 1: Ukázka GUI při počátečním spuštění programu JednorozmernePoleWPF

Výsledek:


Výstup programu 2: Ukázka seřazení jednorozměrného pole v programu JednorozmernePoleWPF

2. Analýza a návrh řešení

V příkladu bude využit stejný princip vytvoření, plnění, zobrazení a operace s jednorozměrným polem jako v předchozím příkladu JednorozmernePole, proto již není zapotřebí provádět detailní analýzu. 

Pro rozložení jednotlivých prvků na formuláři použijeme Grid vložený do formuláře, který rozdělíme na 3 řádky - viz Obrázek 1. V dalších kapitolách si postupně popíšeme jednotlivé řádky mřížky.  


Obrázek 1: Návrh GUI - Základní rozdělení mřížky formuláře na 3 řádky (JednorozmernePoleWPF)

2.1. Nastavení atributů pole

Do prvního řádku Grid  (s indexem 0) umístíme objekt typu GroupBox s titulkem Nastavení vektoru (vektor je synonymum pro jednorozměrné pole) - viz Obrázek 1. Do tohoto objektu vložíme další mřížku Grid, pomocí které rozdělíme vnitřní prostor na dvě řádky. Do prvního řádku tohoto Grid umístíme popisek (Label) s textem "Vektor". Do druhé řádky umístíme další mřížku Grid, pomocí níž rozdělíme vnitřní prostor tohoto řádku na čtyři sloupce. Do každého sloupce umístíme GroupBox pro nastavení rozměru vektoru, hodnot prvků vektoru (pomocí nastavení dolní a horní meze) a poslední sloupec bude obsahovat atributy pro možnosti plnění vektoru po jednotlivých prvcích, nebo pro změnu hodnoty určitého prvku vektoru. 

GroupBox pro nastavení rozměru, umístěný v prvním sloupci Grid, bude obsahovat objekt typu WrapPanel, do něhož umístíme popisek (Label) a vstupní pole (TextBox), ve kterém bude uživatel specifikovat počet prvků vektoru.

GroupBox pro nastavení dolní a horní meze hodnot prvků vektoru, umístěného ve druhém sloupci Grid, bude obsahovat další mřížku (Grid), kterou rozdělíme na dva řádky a dva sloupce. Do prvního řádku prvního sloupce této mřížky umístíme popisek (Label) "Minimum:". Tento popisek je popiskem pro vstupní pole (TextBox), kde uživatel specifikuje dolní mez hodnot prvků vektoru. Toto vstupní pole umístíme do druhého sloupce prvního řádku této mřížky. Stejným způsobem vyřešíme zadávání horní meze prvků vektoru, kde objekty typu Label a TextBox umístíme do prvního a druhého sloupce následujícího druhého řádku této mřížky. 

Další sloupec Grid necháme volný. Tento prostor bude vyplňovat zbývající místo při roztažení, nebo zmenšení formuláře.

GroupBox pro plnění vektoru po jednotlivých prvcích umístíme do posledního sloupce mřížky (Grid). V tomto GroupBox opět využijeme rozdělení prostoru na 2 řádky a 2 sloupce pomocí další vložené mřížky (Grid). Do prvního řádku a prvního sloupce mřížky umístíme popisek (Label) s textem "Index:". Do dalšího sloupce ve stejném řádku umístíme vstupní pole (TextBox) pro specifikaci indexu prvku. Do dalšího řádku do prvního sloupce této mřížky umístíme popisek (Label) s textem "Hodnota:". Do dalšího sloupce ve stejném řádku umístíme vstupní pole (TextBox) pro specifikaci hodnoty prvku s indexem, který uživatel zadal v horním řádku této mřížky. 

První řádek základní mřížky formuláře bude obsahovat objekty (kontrolky), které budou vnořeny následujícím způsobem:

  • Grid (první řádek základní mřížky formuláře)
    • GroupBox
      • Grid
        • Label
        • Grid
          • GroupBox
            • WrapPanel
              • Label
              • TextBox: TxtPocetPrvku
          • GroupBox
            • Grid
              • Label
              • TextBox: TxtMinHodnota
              • Label
              • TextBox: TxtMaxHodnota
          • GroupBox
            • Grid
              • Label
              • TextBox: TxtPrvekIndex
              • Label
              • TextBox: TxtHodnota



Obrázek 1: Návrh GUI - nastavení atributů pole - rozložení prvků v prvním řádku mřížky formuláře (JednorozmernePoleWPF)

Formulář bude obsahovat následující prvky - viz Obrázek 2.


Obrázek 2: Návrh GUI - nastavení atributů pole - účel jednotlivých objektů v prvním řádku mřížky formuláře (JednorozmernePoleWPF)

2.2. Zobrazení pole

Do druhého řádku základní mřížky formuláře (s indexem 1) umístíme objekt typu GroupBox se záhlavím "Zobrazení vektoru", který bude obsahovat další mřížku (Grid), kterou rozdělíme na dva sloupce - viz Obrázek 1. 

Do prvního sloupce mřížky umístíme GroupBox, jehož záhlaví bude obsahovat text "Vektor". V tomto GroupBox bude umístěn objekt typu ListView, pomocí něhož budeme zobrazovat jednotlivé prvky vektoru pod sebou. Ve druhém sloupci mřížky se bude nacházet také objekt GroupBox. V tomto GroupBox budeme zobrazovat výsledný vektor, např. po provedení operace setřídění. Prvky vektoru budou vypisovány v řádku za sebou a budou mezi sebou odděleny čárkou - viz Obrázek 2. 

Formulář bude obsahovat následující objekty (kontrolky), které budou vnořeny následujícím způsobem:

  • Grid (druhý řádek základní mřížky formuláře)
    • GroupBox
      • Grid
        • GroupBox
          • ListView: LstVektor
        • GroupBox
          • TextBox: TxtVysledek



Obrázek 1: Návrh GUI - rozložení prvků v mřížce formuláře (JednorozmernePoleWPF) 

Formulář bude obsahovat následující prvky - viz Obrázek 2.


Obrázek 2: Návrh GUI a účel jednotlivých objektů (JednorozmernePoleWPF)

2.3. Operace s polem

Do třetího řádku základní mřížky formuláře (s indexem 2) umístíme další mřížku (Grid). Tuto mřížku rozdělíme do 3 sloupců, které využijeme jako oddělené sekce Plnit, Výstup a Výpočet s jednotlivými tlačítky - viz Obrázek 1. 

Do prvního sloupce této vložené mřížky umístíme objekt typu StackPanel. Do tohoto objektu jako první umístíme popisek (Label) "Plnit", který bude tvořit záhlaví sekce. Pod popisek umístíme 3 tlačítka:

  • Náhodně - plnění vektoru prvky, jenž každý obsahuje náhodně vygenerovanou hodnotu na základě rovnoměrného rozdělení v intervalu, jehož dolní mez představuje hodnota, která je načtena z prvního řádku základní mřížky, tj. hodnota vstupního pole Minimum umístěného na formuláři a hodnota horní meze, která je načtena ze vstupního pole Maximum na formuláři
  • Jednotlivě - plnění vektoru na základě hodnoty uvedené ve vstupním poli Hodnota u prvku, který je indexován pomocí Index: umístěného v prvním řádku základní mřížky
  • Nulovat - plnění vektoru prvky s hodnotou 0

Do druhého sloupce umístíme objekt typu StackPanel. Do tohoto objektu jako první umístíme popisek (Label) "Výstup", který bude tvořit záhlaví sekce. Pod popisek umístíme 2 tlačítka:

  • Vektor jako text - výpis prvků vektoru do řádku za sebou v objektu typu TextBox, kde jednotlivé prvky jsou odděleny čárkou
  • Do mřížky - výpis prvků vektoru do jednotlivých řádků v objektu typu ListView

Do třetího sloupce mřížky umístíme objekt typu StackPanel. Do tohoto objektu jako první umístíme popisek (Label) "Výpočet", který bude tvořit záhlaví sekce. Pod popisek umístíme 4 tlačítka:

  • Minimum -  hledání prvku vektoru s nejmenší hodnotou, včetně vypsání indexu minima
  • Maximum - hledání prvku vektoru s největší hodnotou, včetně vypsání indexu maxima
  • Průměr - výpočet aritmetického průměru ze všech prvků vektoru
  • Seřadit - vzestupné třídění všech prvků vektoru
Pod vloženou mřížku se třemi sloupci umístíme objekt typu WrapPanel, který zarovnáme k pravému okraji. Do tohoto objektu umístíme tlačítko Konec, pomocí kterého uživatel zavře formulář - viz Obrázek 2.  

Formulář bude obsahovat následující objekty (kontrolky), které budou vnořeny následujícím způsobem:

  • Grid (třetí řádek základní mřížky formuláře)
    • StackPanel
      • Grid
        • StackPanel
          • Label
          • Button: BtnNahodne
          • Button: BtnJednotlive
          • Button: Nulovat
        • StackPanel
          • Label
          • Button: BtnVektorJakoText
          • Button: BtnDoMrizky
        • StackPanel
          • Label
          • Button: BtnMinimum
          • Button: BtnMaximum
          • Button: BtnPrumer
          • Button: BtnSeradit
      • WrapPanel
        • Button: BtnKonec


Obrázek 1: Návrh GUI - tlačítka pro operace s polem (JednorozmernePoleWPF)

Formulář bude obsahovat následující prvky - viz Obrázek 2.


Obrázek 2: Návrh GUI - operace s polem - účel jednotlivých objektů v prvním řádku mřížky formuláře (JednorozmernePoleWPF)

3. XAML

Na základě našich zkušeností s XAML bude již stručně popsán postup tvorby formuláře. Základní atributy (titulek, výšku a šířku) formuláře nastavíme následujícím způsobem. Budeme také definovat minimální výšku a šířku, na kterou lze formulář zmenšit - viz Kód 1.

Title="Základní práce s vektorem" Height="600" Width="800" MinHeight="500" MinWidth="700">

Kód 1: Nastavení atributů formuláře

Objekt typu Grid umístěný na formuláři rozdělíme na tři řádky. První a poslední řádek se přizpůsobí obsahu vložených prvků. Výška druhého řádku se bude přizpůsobovat roztažení okna - viz Kód 2. 

Abychom následující XAML kód zjednodušili pro čtení a pochopení podstaty, využijeme komentáře v kódu XAML pomocí nichž rozdělíme XAML kód na určité sekce, které budou v kapitolách postupně doplněny - viz Kód 2.

<Grid.RowDefinitions>
    <RowDefinition Height="Auto"/>
    <RowDefinition Height="*"/>
    <RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!-- Nastavení vektoru -->

<!-- Zobrazení vektoru -->

<!-- Tlačítka - sekce: Plnit, Výstup, Výpočet -->

Kód 2: Rozdělení Grid na řádky a komentáře jednotlivých sekcí

Formulář

Navržené rozložení prvků na formuláři, včetně formuláře samotného v této části etapy, je vidět na následujícím obrázku - viz Obrázek 1.


Obrázek 1: Rozpracovaný formulář WPF aplikace

Objekty na formuláři:

Formulář v této fázi obsahuje pouze jeden objekt (kontrolku):

  • Grid

který je umístěn následujícím způsobem - viz Obrázek 2.


Obrázek 2: VS - okno Document Outline - seznam objektů

3.1. Nastavení atributů pole

Začněme nejprve popisem vytvářeného XAML kódu v první řádce základní mřížky formuláře. Tato řádka bude obsahovat objekty, které slouží k nastavení atributů jednorozměrného pole - vektoru. Prvním vloženým objektem seskupujícím jednotlivé objekty je GroupBox. Do záhlaví (vlastnost Header) tohoto objektu vložíme text "Nastavení vektoru".  Do objektu vložíme další mřížku, která nám rozdělí prostor na dva řádky (rozměry se budou přizpůsobovat vloženému obsahu). Do prvního řádku vložíme vložíme zvětšený (FontSize) tučný (FontWeight) vystředěný (HorizontalAlignment) popisek "Vektor" (Label), který bude uživatelem vnímám jako nadpis celého formuláře. Pod tento popisek vložíme další mřížku, která nám rozdělí zbývající prostor na čtyři sloupce, do nichž umístíme sekce pro specifikaci rozměru vektoru, meze intervalu hodnot prvků vektoru a prvku vektoru, který je definován svým indexem - viz Kód 1. V kódu budeme dále doplňovat pod komentáře zbývající části XAML kódu jednotlivých objektů formuláře.

<!-- Nastavení vektoru -->
<GroupBox Header="Nastavení vektoru">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <Label Content="Vektor" FontSize="18" FontWeight="Bold" HorizontalAlignment="Center" />
        <Grid Grid.Row="1">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="Auto"/>
                </Grid.ColumnDefinitions>
                <!-- Rozměr vektoru -->
                  
                <!-- Hodnoty - meze -->
                    
                <!-- Prvek ve vektoru -->
                    
        </Grid>
    </Grid>
</GroupBox>

Kód 1: GroupBox - nastavení vektoru (jednorozměrného pole)

Pod komentář Rozměr vektoru vložíme do prvního sloupce mřížky objekt GroupBox se záhlavím "Rozměr vektoru". Do tohoto objektu vložíme WrapPanel pro umístění objektů vedle sebe. Těmito objekty budou popisek (Label) a vstupní pole (TextBox) pro zadání rozměru vektoru, tj. počtu prvků vektoru. U objektu typu Label nastavíme vertikální zarovnání na střed (vlastnost VerticalAlignment). U objektu TextBox nastavíme vnitřní okraje (vlastnost Padding), vnější okraje (vlastnost Margin) a šířku (Width) na 100 pixelů. Pro objekt TextBox vygenerujeme obsluhu události při opuštění tohoto objektu (událost LostFocus) pomocí nastavení vlastnosti LostFocus a zvolení položky <New Event Handler> - viz Kód 2.

<!-- Rozměr vektoru -->
<GroupBox Header="Rozměr vektoru">
    <WrapPanel>
        <Label Content="Počet prvků:" VerticalAlignment="Center"/>
        <TextBox Name="TxtPocetPrvku" Grid.Column="1" Width="100" Margin="5" Padding="5" 
                 LostFocus="TxtPocetPrvku_LostFocus"/>
    </WrapPanel>
</GroupBox>

Kód 2: GroupBox - rozměr vektoru

Pod komentář Hodnoty - meze vložíme do druhého sloupce mřížky znovu objekt GroupBox, nyní však se záhlavím "Hodnoty - meze". Do tohoto objektu vložíme Grid, který rozdělíme na 2 řádky a 2 sloupce. Do prvního řádku prvního sloupce této mřížky umístíme popisek (Label) "Minimum:". Tento popisek je popiskem pro vstupní pole (TextBox), kde uživatel specifikuje dolní mez hodnot prvků vektoru. Toto vstupní pole umístíme do druhého sloupce prvního řádku této mřížky (Grid.Column). Stejným způsobem vyřešíme zadávání horní meze prvků vektoru v dalším řádku (Grid.Row), kde objekty typu Label a TextBox umístíme do prvního a druhého sloupce (Grid.Column) následujícího druhého řádku této mřížky. U těchto objektů nastavíme jejich další vlastnosti - viz Kód 3. U obou  objektů typu TextBox vygenerujeme obsluhu události při opuštění tohoto objektu (událost LostFocus) pomocí nastavení vlastnosti LostFocus a zvolení položky <New Event Handler> .

<!-- Hodnoty - meze -->
<GroupBox Header="Hodnoty - meze" Grid.Column="1">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
        <Label Content="Minimum:" VerticalAlignment="Center"/>
        <TextBox Name="TxtMinHodnota" Grid.Column="1" Width="100" Margin="5" Padding="5" 
                 LostFocus="TxtMinHodnota_LostFocus"/>
        <Label Content="Maximum:" Grid.Row="1" VerticalAlignment="Center"/>
        <TextBox Name="TxtMaxHodnota" Grid.Row="1" Grid.Column="1" Width="100" Margin="5" Padding="5"
                 LostFocus="TxtMaxHodnota_LostFocus"/>
    </Grid>
</GroupBox>

Kód 3: GroupBox - hodnoty mezí intervalu přípustných hodnot prvků vektoru

Další sloupec mřížky v první řádku formuláře necháme volný. Tento prostor bude vyplňovat zbývající místo při roztáhnutí, nebo zmenšení formuláře. Do posledního sloupce mřížky, tj. pod komentář Prvek ve vektoru,  umístíme GroupBox pro plnění vektoru po jednotlivých prvcích. V tomto GroupBox opět využijeme rozdělení prostoru na 2 řádky a 2 sloupce pomocí další vložené mřížky (Grid). Do prvního řádku a prvního sloupce mřížky umístíme popisek (Label) s textem "Index:". Do dalšího sloupce ve stejném řádku umístíme vstupní pole (TextBox) pro specifikaci indexu prvku, jehož šířka bude nastavena fixní hodnotou (Width). Pro objekt TextBox vygenerujeme obsluhu události při opuštění tohoto objektu (událost LostFocus) pomocí nastavení vlastnosti LostFocus a zvolení položky <New Event Handler> .

Do dalšího řádku prvního sloupce této mřížky umístíme popisek (Label) s textem "Hodnota:". Do dalšího sloupce ve stejném řádku umístíme vstupní pole (TextBox) o fixní délce pro specifikaci hodnoty prvku s indexem, který uživatel zadal v horním řádku této mřížky - viz Kód 4. 

<!-- Prvek ve vektoru -->
<GroupBox Header="Prvek ve vektoru" Grid.Column="3">
    <Grid  Margin="5">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
             <ColumnDefinition Width="Auto"/>
             <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
        <Label Content="Index:" Grid.Column="0"/>
        <TextBox Name="TxtPrvekIndex" Grid.Column="1" Width="100" LostFocus="TxtPrvekIndex_LostFocus"/>
        <Label Content="Hodnota:" Grid.Row="1" Grid.Column="0"/>
        <TextBox Name="TxtHodnota" Grid.Row="1" Grid.Column="1" Width="100" LostFocus="TxtHodnota_LostFocus"/>
    </Grid>
</GroupBox>

Kód 4: GroupBox - prvek ve vektoru

Formulář

Navržené rozložení prvků v prvním řádku základní mřížky na formuláři v této části etapy, je vidět na následujícím obrázku - viz Obrázek 1.


Obrázek 1: Rozpracovaný formulář WPF aplikace - první řádek základní mřížky

Objekty na formuláři:

Formulář v prvním řádku základní mřížky formuláře obsahuje následující objekty (kontrolky):

  • Grid (4x)
  • GroupBox (4x)
  • Label (6x)
  • WrapPanel 
  • TextBox: TxtPocetPrvku, TxtMinHodnota, TxtMaxHodnota, TxtPrvekIndex, TxtHodnota

které jsou umístěny následujícím způsobem - viz Obrázek 2.


Obrázek 2: VS - okno Document Outline - seznam objektů - první řádek základní mřížky

3.2. Zobrazení pole

Do druhého řádku základní mřížky formuláře (s indexem 1) umístíme objekt typu GroupBox se záhlavím "Zobrazení vektoru", který bude obsahovat další mřížku (Grid), kterou rozdělíme na dva sloupce - viz Kód 1.   V kódu budeme dále doplňovat pod komentáře zbývající části XAML kódu jednotlivých objektů formuláře.

<!-- Zobrazení vektoru -->
<GroupBox Header="Zobrazení vektoru" Grid.Row="1">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <!-- Vektor -->
      
<!-- Výsledek -->     </Grid> </GroupBox>

Kód 1: GroupBox - zobrazení vektoru

Pod komentář Vektor vložíme do prvního sloupce mřížky GroupBox, jehož záhlaví bude obsahovat text "Mřížka". V tomto GroupBox bude umístěn objekt typu ListView (objekt LstVektor), pomocí něhož budeme zobrazovat jednotlivé prvky vektoru pod sebou. Všimněme si, že u tohoto objektu lze zobrazit posuvník, v našem případě svislý posuvník, který umožňuje vertikálně posouvat vložený obsah do tohoto objektu (vlastnost ScrollViewer.VerticalScrollBarVisibility). Nastavení této vlastnosti na hodnotu "Auto" zajistí, že pokud obsah nebude zobrazen celý v tomto objektu, je automaticky zpřístupněn (zviditelněn) posuvník - viz Kód 2.

<!-- Vektor -->
<GroupBox Header="Mřížka" Margin="5" MinHeight="100">
    <ListView Name="LstVektor" ScrollViewer.VerticalScrollBarVisibility="Auto"/>
</GroupBox>

Kód 2: GroupBox - zobrazení prvků vektoru v jednotlivých řádcích v objektu ListView

Pod komentář Výsledek vložíme ve druhém sloupci mřížky ve stejném řádku objekt GroupBox. V tomto GroupBox budeme zobrazovat výsledný vektor např. po provedení operace setřídění. Prvky vektoru budou vypisovány v řádku za sebou (a budou mezi sebou odděleny čárkou což provedeme pomocí CodeBehind). U objektu typu TextBox (objekt TxtVysledek) jsme zapnuly (zviditelnily, tj. hodnota "Visible") oba posuvníky jak horizontální (ScrollViewer.HorizontalScrollBarVisibility), tak i vertikální (ScrollViewer.VerticalScrollBarVisibility). Objekt TextBox bude určen pouze pro výpis (IsReadOnly) a nastavíme modré pozadí (BackGround) - viz Kód 3. 

<!-- Výsledek -->
<GroupBox Header="Jako text (nebo výpis výsledku)" Grid.Column="1" Margin="5">
    <TextBox Name="TxtVysledek" Margin="5" ScrollViewer.HorizontalScrollBarVisibility="Visible" 
             ScrollViewer.VerticalScrollBarVisibility="Visible" IsReadOnly="True" Background="AliceBlue"/>
</GroupBox>

Kód 3: GroupBox - zobrazení prvků vektoru za sebou v objektu TextBox

Formulář

Navržené rozložení prvků ve druhém řádku základní mřížky na formuláři v této části etapy je vidět na následujícím obrázku - viz Obrázek 1.


Obrázek 1: Rozpracovaný formulář WPF aplikace - druhý řádek základní mřížky

Objekty na formuláři:

Formulář v druhém řádku základní mřížky formuláře obsahuje následující objekty (kontrolky):

  • GroupBox (3x)
  • Grid 
  • ListView: LstVektor
  • TextBox: TxtVysledek

které jsou umístěny následujícím způsobem - viz Obrázek 2.


Obrázek 2: VS - okno Document Outline - seznam objektů - druhý řádek základní mřížky

3.3. Operace s polem

V posledním řádku základní mřížky formuláře (s indexem 2) se bude nacházet další mřížka (Grid). Tuto mřížku rozdělíme do 3 sloupců, které využijeme jako oddělené sekce Plnit, Výstup a Výpočet s jednotlivými tlačítky - viz Kód 1. 

<!-- Tlačítka - sekce: Plnit, Výstup, Výpočet -->
<StackPanel Grid.Row="4">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <!-- Plnit -->

        <!-- Výstup -->

        <!-- Výpočet -->

    </Grid>
    <!-- Konec -->

</StackPanel>

Kód 1: StackPanel - tlačítka pro operace s vektorem

Pod komentář Plnit vložíme do prvního sloupce této mřížky objekt typu StackPanel. Do tohoto objektu jako první umístíme popisek (Label) "Plnit", který bude tvořit záhlaví sekce. Pod popisek umístíme 3 tlačítka:

  • Náhodně (objekt BtnNahodne) - plnění vektoru prvky, kde každý prvek obsahuje náhodně vygenerovanou hodnotu na základě rovnoměrného rozdělení v intervalu, jehož dolní mez představuje hodnotu, která je načtena z prvního řádku základní mřížky, tj. hodnota ve vstupním poli (objekt TxtMinHodnota) umístěného vpravo vedle popisku Minimum a hodnota horní meze, která je načtena ze vstupního pole (objekt TxtMaxHodnota) umístěného vpravo vedle popisku Maximum
  • Jednotlivě (objekt BtnJednotlive) - plnění prvku vektoru na základě hodnoty uvedené ve vstupním poli (objekt TxtHodnota) umístěného vpravo vedle popisku Hodnota, kde prvek vektoru je indexován pomocí hodnoty ve vstupním poli (objekt TxtPrvekIndex) umístěného vpravo od popisku Index: 
  • Nulovat (objekt BtnNulovat) - plnění vektoru prvky s hodnotou 0

U všech tlačítek nastavíme vnitřní okraje (vlastnost Padding) a také vnější okraje (vlastnost Margin). Pro všechna tlačítka vygenerujeme obsluhu události stisknutí tlačítka (událost Click) pomocí nastavení vlastnosti Click a zvolení položky <New Event Handler> - viz Kód 2.

<!-- Plnit -->
<StackPanel >
    <Label Content="Plnit:" FontWeight="Bold" FontSize="16" HorizontalAlignment="Center"/>
    <Button Name="BtnNahodne" Content="Náhodně" Margin="5" Padding="10,5" Click="BtnNahodne_Click"/>
    <Button Name="BtnJednotlive" Content="Jednotlivě" Margin="5" Padding="10,5" Click="BtnJednotlive_Click"/>
    <Button Name="BtnNulovat" Content="Nulovat" Margin="5" Padding="10,5" Click="BtnNulovat_Click"/>
</StackPanel>

Kód 2: StackPanel - tlačítka pro plnění vektoru

Pod komentář Výstup vložíme do druhého sloupce objekt typu StackPanel. Do tohoto objektu jako první umístíme popisek (Label) "Výstup", který bude tvořit záhlaví sekce. Pod popisek umístíme 2 tlačítka:

  • Vektor jako text (objekt BtnVektorJakoText) - výpis prvků vektoru do řádku za sebou v objektu typu TextBox (objekt TxtVysledek), kde jednotlivé prvky jsou odděleny čárkou
  • Do mřížky (objekt BtnDoMrizky) - výpis prvků vektoru do jednotlivých řádků v objektu typu ListView (objekt LstVektor)

U všech tlačítek nastavíme vnitřní okraje (vlastnost Padding) a také vnější okraje (vlastnost Margin). Pro všechna tlačítka vygenerujeme obsluhu události stisknutí tlačítka (událost Click) pomocí nastavení vlastnosti Click a zvolení položky <New Event Handler> - viz Kód 3.

<!-- Výstup -->
<StackPanel Grid.Column="1">
    <Label Content="Výstup:" FontWeight="Bold" FontSize="16" HorizontalAlignment="Center"/>
    <Button Name="BtnVektorJakoText" Content="Vektor jako text"  Margin="5" Padding="10,5" 
            Click="BtnVektorJakoText_Click"/>
    <Button Name="BtnDoMrizky" Content="Do mřížky" Margin="5" Padding="10,5" Click="BtnDoMrizky_Click"/>
</StackPanel>

Kód 3: StackPanel - tlačítka pro výpis vektoru

Pod komentář Výpočet vložíme do třetího sloupce mřížky objekt typu StackPanel. Do tohoto objektu jako první umístíme popisek (Label) "Výpočet", který bude tvořit záhlaví sekce. Pod popisek umístíme 4 tlačítka:

  • Minimum (objekt BtnMinimum) -  hledání prvku vektoru s nejmenší hodnotou, včetně vypsání indexu minima
  • Maximum (objekt BtnMaximum) - hledání prvku vektoru s největší hodnotou, včetně vypsání indexu maxima
  • Průměr (objekt BtnPrumer) - výpočet aritmetického průměru ze všech prvků vektoru
  • Seřadit (objekt BtnSeradit) - vzestupné třídění všech prvků vektoru

U všech tlačítek nastavíme vnitřní okraje (vlastnost Padding) a také vnější okraje (vlastnost Margin). Pro všechna tlačítka vygenerujeme obsluhu události stisknutí tlačítka (událost Click) pomocí nastavení vlastnosti Click a zvolení položky <New Event Handler> - viz Kód 4.

<!-- Výpočet -->
<StackPanel Grid.Column="2">
    <Label Content="Výpočet:" FontWeight="Bold" FontSize="16" HorizontalAlignment="Center"/>
    <Button Name="BtnMinimum" Content="Minimum"  Margin="5" Padding="10,5" Click="BtnMinimum_Click"/>
    <Button Name="BtnMaximum" Content="Maximum" Margin="5" Padding="10,5" Click="BtnMaximum_Click"/>
    <Button Name="BtnPrumer" Content="Průměr" Margin="5" Padding="10,5" Click="BtnPrumer_Click"/>
    <Button Name="BtnSeradit" Content="Seřadit" Margin="5" Padding="10,5" Click="BtnSeradit_Click"/>
</StackPanel>

Kód 4: StackPanel - tlačítka pro výpočty s prvky vektoru 

Pod komentář Konec umístíme objekt typu WrapPanel, který zarovnáme k pravému okraji. Do tohoto objektu umístíme tlačítko Konec, pomocí kterého uživatel zavře formulář. Nastavíme velikost vnějšího okraje (vlastnost Margin) a šířku tlačítka nastavíme na 100 pixelů - viz Kód 5.

<!-- Konec -->
<WrapPanel HorizontalAlignment="Right">
    <Button Name="BtnKonec" Content="Konec" Margin="5" Width="100" Padding="5"/>
</WrapPanel>

Kód 5: WrapPanel - tlačítko pro zavření formuláře  

Formulář

Navržené rozložení prvků ve třetím řádku základní mřížky na formuláři v této části etapy je vidět na následujícím obrázku - viz Obrázek 1.


Obrázek 1: Rozpracovaný formulář WPF aplikace - třetí řádek základní mřížky

Objekty na formuláři:

Formulář v třetím řádku základní mřížky formuláře obsahuje následující objekty (kontrolky):

  • StackPanel (4x)
  • Grid 
  • Label (3x)
  • WrapPanel
  • Button: BtnNahodne, BtnJednotlive, BtnNulovat, BtnVektorJakoText, BtnDoMrizky, BtnMinimum, BtnMaximum, BtnPrumer, BtnSeradit, BtnKonec

které jsou umístěny následujícím způsobem - viz Obrázek 2.


Obrázek 2: VS - okno Document Outline - seznam objektů - třetí řádek základní mřížky

3.4. XAML - prvky formuláře

Následující XAML kód obsahuje nastavení formuláře - viz Kód 1. Pokud je zapotřebí zkopírujte XAML kód a vložte jej namísto řádky s nastavením vlastností okna (řádek začíná Title=....).

Title="Základní práce s vektorem" Height="600" Width="800" MinHeight="500" MinWidth="700">

Kód 1: Nastavení vlastností formuláře

Grid

Následující zdrojový kód XAML obsahuje potřebné prvky na formuláři pro řešení úlohy, bez nastavení událostí - viz Kód 2. Pokud je zapotřebí, zkopírujte XAML kód a vložte jej mezi počáteční a koncovou značku prvku Grid.

<Grid.RowDefinitions>
    <RowDefinition Height="Auto"/>
    <RowDefinition Height="*"/>
    <RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!-- Nastavení vektoru -->
<GroupBox Header="Nastavení vektoru">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <Label Content="Vektor" FontSize="18" FontWeight="Bold" HorizontalAlignment="Center" />
        <Grid Grid.Row="1">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="Auto"/>
            </Grid.ColumnDefinitions>
            <!-- Rozměr vektoru -->
            <GroupBox Header="Rozměr vektoru">
                <WrapPanel>
                    <Label Content="Počet prvků:" VerticalAlignment="Center"/>
                    <TextBox Name="TxtPocetPrvku" Grid.Column="1" Width="100" Margin="5" Padding="5"/>
                </WrapPanel>
            </GroupBox>
            <!-- Hodnoty - meze -->
            <GroupBox Header="Hodnoty - meze" Grid.Column="1">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="Auto"/>
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="Auto"/>
                    </Grid.ColumnDefinitions>
                    <Label Content="Minimum:" VerticalAlignment="Center"/>
                    <TextBox Name="TxtMinHodnota" Grid.Column="1" Width="100" Margin="5" Padding="5"/>
                    <Label Content="Maximum:" Grid.Row="1" VerticalAlignment="Center"/>
                    <TextBox Name="TxtMaxHodnota" Grid.Row="1" Grid.Column="1" Width="100" Margin="5" Padding="5"/>
                </Grid>
            </GroupBox>
            <!-- Prvek ve vektoru -->
            <GroupBox Header="Prvek ve vektoru" Grid.Column="3">
                <Grid  Margin="5">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="Auto"/>
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="Auto"/>
                    </Grid.ColumnDefinitions>
                    <Label Content="Index:" Grid.Column="0"/>
                    <TextBox Name="TxtPrvekIndex" Grid.Column="1" Width="100"/>
                    <Label Content="Hodnota:" Grid.Row="1" Grid.Column="0"/>
                    <TextBox Name="TxtHodnota" Grid.Row="1" Grid.Column="1" Width="100"/>
                </Grid>
            </GroupBox>
        </Grid>
    </Grid>
</GroupBox>
<!-- Zobrazení vektoru -->
<GroupBox Header="Zobrazení vektoru" Grid.Row="1">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <!-- Vektor -->
        <GroupBox Header="Mřížka" Margin="5" MinHeight="100">
            <ListView Name="LstVektor" ScrollViewer.VerticalScrollBarVisibility="Auto"/>
        </GroupBox>
        <!-- Výsledek -->
        <GroupBox Header="Jako text (nebo výpis výsledku)" Grid.Column="1" Margin="5">
            <TextBox Name="TxtVysledek" Margin="5" ScrollViewer.HorizontalScrollBarVisibility="Visible" 
                        ScrollViewer.VerticalScrollBarVisibility="Visible" IsReadOnly="True" Background="AliceBlue"/>
        </GroupBox>
    </Grid>
</GroupBox>
<!-- Tlačítka - sekce: Plnit, Výstup, Výpočet -->
<StackPanel Grid.Row="4">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <!-- Plnit -->
        <StackPanel >
            <Label Content="Plnit:" FontWeight="Bold" FontSize="16" HorizontalAlignment="Center"/>
            <Button Name="BtnNahodne" Content="Náhodně" Margin="5" Padding="10,5"/>
            <Button Name="BtnJednotlive" Content="Jednotlivě" Margin="5" Padding="10,5"/>
            <Button Name="BtnNulovat" Content="Nulovat" Margin="5" Padding="10,5"/>
        </StackPanel>
        <!-- Výstup -->
        <StackPanel Grid.Column="1">
            <Label Content="Výstup:" FontWeight="Bold" FontSize="16" HorizontalAlignment="Center"/>
            <Button Name="BtnVektorJakoText" Content="Vektor jako text"  Margin="5" Padding="10,5"/>
            <Button Name="BtnDoMrizky" Content="Do mřížky" Margin="5" Padding="10,5"/>
        </StackPanel>
        <!-- Výpočet -->
        <StackPanel Grid.Column="2">
            <Label Content="Výpočet:" FontWeight="Bold" FontSize="16" HorizontalAlignment="Center"/>
            <Button Name="BtnMinimum" Content="Minimum"  Margin="5" Padding="10,5"/>
            <Button Name="BtnMaximum" Content="Maximum" Margin="5" Padding="10,5"/>
            <Button Name="BtnPrumer" Content="Průměr" Margin="5" Padding="10,5"/>
            <Button Name="BtnSeradit" Content="Seřadit" Margin="5" Padding="10,5"/>
        </StackPanel>
    </Grid>
    <!-- Konec -->
    <WrapPanel HorizontalAlignment="Right">
        <Button Name="BtnKonec" Content="Konec" Margin="5" Width="100" Padding="5"/>
    </WrapPanel>
</StackPanel>

Kód 2: Prvky v Grid

4. C#

V souboru MainWindow.xaml.cs obsahující kód na pozadí (Code Behind) byla vygenerována základní struktura našeho programu v C#. Vedle konstruktoru MainWindow této třídy byly také vygenerovány soukromé (private) metody bez návratu, které umístíme do oblasti Události:

  • TxtPocetPrvku_LostFocus
  • TxtMinHodnota_LostFocus
  • TxtMaxHodnota_LostFocus
  • TxtPrvekIndex_LostFocus
  • TxtHodnota_LostFocus
  • BtnNahodne_Click
  • BtnJednotlive_Click
  • BtnNulovat_Click
  • BtnVektorJakoText_Click
  • BtnDoMrizky_Click
  • BtnMinimum_Click
  • BtnMaximum_Click
  • BtnPrumer_Click
  • BtnSeradit_Click
  • BtnKonec_Click

Protože zdrojový kód bude poměrně dlouhý, mohli bychom také zmínit možnost vložení komentáře // TODO . Díky vložení takového typu komentáře lze vytvářet seznam úkolů, např. které musíme dopracovat - viz Kód 1. 

// TODO: Dopracovat metodu pro automatické plnění vektoru

Kód 1: Příklad použití komentáře pro seznam úkolů

Pro zobrazení seznamu úkolů si totiž můžeme zobrazit panel Task List pomocí hlavní horní nabídkové lišty VS: View → TaskList . V dolní části VS se zobrazí okno se seznamem úkolů, které chceme na základě komentářů příště řešit - viz Obrázek 1. Stačí pak jen v panelu poklepat na úkol a VS vás přepne do místa, kde jste daný komentář napsali.


Obrázek 1: VS - Task List - seznam úkolů

Vzhledem k tomu, že C# kód bude rozsáhlejší, bude vhodné použít značky regionů, kde pro větší přehlednost uvedeme název regionu jak za počáteční značkou regionu (#region), tak i za koncovou značkou (#endregion). Vytvoříme si následující regiony, které budou obsahovat další vnořené regiony. U již vygenerovaných metod si také uvedeme, do kterého regionu budou patřit:

  • Datové složky třídy
  • Pomocné metody
    • Zobrazení pole
    • Plnění pole
    • Operace s polem 
  • Události
    • Nastavení atributů pole - region bude obsahovat následující metody: 
      • TxtPocetPrvku_LostFocus
      • TxtMinHodnota_LostFocus
      • TxtMaxHodnota_LostFocus
      • TxtPrvekIndex_LostFocus
      • TxtHodnota_LostFocus
    • Plnění pole - region bude obsahovat následující metody: 
      • BtnNahodne_Click
      • BtnJednotlive_Click
      • BtnNulovat_Click
    • Zobrazení pole - region bude obsahovat následující metody: 
      • BtnVektorJakoText_Click
      • BtnDoMrizky_Click
    • Operace s polem - region bude obsahovat následující metody: 
      • BtnMinimum_Click
      • BtnMaximum_Click
      • BtnPrumer_Click
      • BtnSeradit_Click

Takto vytvořené regiony lze sbalit, nebo rozbalit a přehledně si tak můžeme zobrazit pouze ty metody, které nás zajímají. 

Do regionu Datové složky třídy si umístíme seznam jednotlivých datových složek třídy (atributů částečné třídy MainWindow), do nichž budeme ukládat a nebo načítat hodnoty. V podstatě se jedná o proměnné, které lze využívat v rámci celé třídy (globální proměnné) - viz Kód 2. Hodnoty v datových složkách využijeme pro specifikaci atributů vektoru - rozměru a intervalu přípustných hodnot prvků vektoru. Uveďme pro úplnost, že datové složky jsou přístupné pouze uvnitř třídy (modifikátor přístupu private). Jedna z datových složek s názvem Max je konstantní (klíčové slovo const), tzn. se nebude v průběhu programu měnit. V tomto regionu budeme také deklarovat samotné jednorozměrné pole (vektor) obsahující celá čísla. 

namespace JednorozmernePoleWPF
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        #region Datové složky třídy (globální proměnné)
        // Specifikace konstanty a inicializace
        const int Max = 10;
        // Aktuální rozměr pole - počet prvků
        private int pocetPrvku;
        // Přípustná minimální hodnota (dolní mez) prvku - inicializace
        private int minHodnota = 1;
        // Přípustná maximální hodnota (horní mez) prvku - inicializace
        private int maxHodnota = 100;
 
        // Deklarace pole
        private int[] pole;
        #endregion Datové složky třídy
 
 
        public MainWindow()
        {
            InitializeComponent();
        }
    }
}

Kód 2: Deklarace datových složek třídy

Asi jste si všimli, že třída obsahuje vlastní konstruktor MainWindow (dá se říci metodu, která nese stejné jméno třídy a zajišťuje vygenerování instance třídy, tedy našeho formuláře). Konstruktor doplníme o jednotlivé příkazy, které nám zajistí vyplnění hodnot v příslušných objektech na formuláři na základě hodnot jednotlivých datových složek třídy. K přístupu k jednotlivým datovým složkám třídy využijeme klíčové slovo this spolu s tečkou za tímto slovem (tečková notace). 

Budeme také muset vytvořit instanci třídy - objekt - jednorozměrného pole s definovanou délkou. Do tohoto jednorozměrného pole, tj. vektoru, pak budeme ukládat hodnoty, vypisovat hodnoty a nebo s ním budeme provádět další operace. Vytvoření pole provedeme pomocí implicitního konstruktoru (VS ho vytvořil za nás), který přijímá parametr (hodnotu v datové složce pocetPrvku) určující velikost našeho celočíselného (datový typ int) pole, tj. počet prvků pole. Konstruktor jednorozměrného pole voláme pomocí klíčového slova new. Vytvořenou instanci přiřadíme do datové složky pole v naší třídě.

public MainWindow()
{
    InitializeComponent();
 
    /* Přiřazení maximálního rozměru vektoru do datové složky určující
     * počet prvků vektoru */
    this.pocetPrvku = Max;
 
    // Vytvoření instance (objektu) pole s definovanou délkou
    this.pole = new int[this.pocetPrvku];
 
    /* Přiřazení počtu prvků vektoru do objektu na formuláři určujícího
     * velikost vektoru*/
    this.TxtPocetPrvku.Text = this.pocetPrvku.ToString();
 
    /* Přiřazení přípustné minimální hodnoty prvku ve vektoru do objektu 
     * na formuláři určujícího mezní hodnotu */
    this.TxtMinHodnota.Text = this.minHodnota.ToString();
 
    /* přiřazení přípustné maximální hodnoty prvku ve vektoru do objektu (pole) 
     * na formuláři určujícího mezní hodnotu */
    this.TxtMaxHodnota.Text = this.maxHodnota.ToString();
}

Kód 3: Konstruktor částečné třídy formuláře



4.1. Nastavení atributů pole

Pojďme se nyní podívat na metody umístěné v regionu Události, tj. metody pro obsluhu událostí objektů formuláře. Tento region obsahuje další regiony, ale my se nyní zaměříme na region Nastavení atributů pole, který bude obsahovat následující metody: 

  • TxtPocetPrvku_LostFocus
  • TxtMinHodnota_LostFocus
  • TxtMaxHodnota_LostFocus
  • TxtPrvekIndex_LostFocus
  • TxtHodnota_LostFocus

První metodou, kterou budeme muset upravit je metoda obsluhy události opuštění objektu TxtPocetPrvku pro specifikaci počtu prvků vektoru, tj. rozměru jednorozměrného pole - viz Kód 1. Pro popis metody využijeme trojitého lomítka, po jehož zadání nad název metody Visual Studio vygeneruje poznámky k dokumentaci ve formě XML prvků přidaných do zdrojového kódu. U těchto prvků budeme specifikovat pouze popis účelu metody. Parametr sender u metody představuje objekt, ke kterému je přidružena metoda obsluhy události v tomto případě TxtPocetPrvku. Další formální parametr e představuje data o události. Tyto popisy jsou u metod obsluhy události přidružených k objektům stejné, proto je již v dalších XML značkách nebudeme popisovat.

Pro metodu deklarujeme lokální proměnnou novaHodnota, do níž budeme ukládat načtenou hodnotu z objektu na formuláři pro specifikaci počtu prvků vektoru. Po načtení textu z objektu na formuláři (vlastnost Text) provedeme test, zda lze text převést na celé číslo pomocí metody TryParse přidružené k třídě (datovému typu) int. Metoda navrací logickou hodnotu (true nebo false), zda lze konverzi provést, či nikoliv. U metody využijeme výstupní parametr (klíčové slovo out) novaHodnota. Znamená to, že pokud nebude provedena konverze, do parametru bude uložena předdefinovaná hodnota pro typ int, tj. hodnota 0. V následující podmínce testujeme, zda hodnota náleží intervalu 1 až maximální rozměr vektoru, jehož hodnota je uložena v konstantě Max. Pokud není, přiřadíme do lokální proměnné novaHodnota maximální rozměr vektoru. Pokud uživatel provedl chybné nastavení rozměru vektoru, je vhodné ho o této situaci informovat. To provedeme pomocí dialogového okna (třída MessageBox metoda Show). Pro konverzi číselné hodnoty na text uvedené ve výpisu můžeme použít metodu Format třídy String (pokud Vám tento přístup nevyhovuje, můžete místo něho využít metodu ToString). Výhodou této metody je, že ve výpisu využijeme indexaci proměnných pomocí složené závorky, do níž uvedeme index proměnné, jejíž hodnotu chceme v textu vypsat. Chybu vyřešíme nastavením rozměru vektoru na maximální povolený rozměr, tj. konstanta Max. Musíme zároveň vypsat tento nový rozměr do objektu pro specifikaci rozměru vektoru umístěného na formuláři. 

Pokud nový rozměr vektoru není stejný jako stávající počet prvků vektoru, pak touto novou hodnotou musíme přepsat stávající rozměr vektoru uloženého v datové složce třídy s názvem pocetPrvku. S tím také souvisí vytvoření nové instance pole s novým rozměrem (v podstatě staré pole je odstraněno tak, že je vytvořeno nové pole a datová složka pole nyní odkazuje na toto nové pole. Nový vektor obsahuje samé 0, což je předefinovaná hodnota pro datový typ int). Pro zobrazení hodnot nového vektoru použijeme dvě metody. První metoda ZobrazitPoleVListView deklarovaná v rámci třídy zobrazí prvky vektoru jako jednotlivé řádky v objektu LstVektor typu ListView. Parametrem je vektor samotný. Nový vektor také zobrazíme jako jednotlivé prvky oddělené čárkou. K tomu využijeme metodu ZobrazitPoleJakoText. Obě metody si budeme deklarovat později v kapitole Zobrazení pole.

/// <summary>
/// Validace rozměru vektoru
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void TxtPocetPrvku_LostFocus(object sender, RoutedEventArgs e)
{
    // Lokální proměnná pro uložení nového počtu prvků vektoru
    int novaHodnota;
    /* Přiřazení počtu prvků z objektu na formuláři do lokální proměnné
     * určující počet prvků vektoru */
    int.TryParse(this.TxtPocetPrvku.Text, out novaHodnota);
    /* Pokud počet prvků je větší než maximální rozměr vektoru, nebo počet
     * prvků vektoru je menší než 1, pak... */
    if ((novaHodnota > Max) || (novaHodnota < 1))
    {
        /* Zobrazení dialogového okna s textem "Chyba velikosti vektoru" a hodnoty 
         * max. rozměru vektoru */
        MessageBox.Show(String.Format("Chyba velikosti vektoru, nastavení na max. rozměr: {0}", Max));
        /* Přiřazení maximálního rozměru vektoru do lokální proměnné určující
         * počet prvků vektoru */
        novaHodnota = Max;
        /* Přiřazení maximálního rozměru vektoru do objektu na formuláři
         * určující počet prvků vektoru */
        this.TxtPocetPrvku.Text = Max.ToString(); 
    }
 
    // Pokud nový rozměr vektoru není stejný jako stávající počet prvků vektoru, pak...
    if (novaHodnota != this.pocetPrvku)
    {
        // Uložení nového rozměru pole do datové složky třídy
        this.pocetPrvku = novaHodnota;
        // Vytvoření nové instance pole s novým rozměrem
        this.pole = new int[this.pocetPrvku];
        // Zavolání metody pro zobrazení vektoru do objektu ListView na formuláři
        this.ZobrazitPoleVListView(this.pole);
        // Zavolání metody pro zobrazení vektoru do objektu TextBox na formuláři
        this.ZobrazitPoleJakoText(novaHodnota, this.pole);
    }
}

Kód 1: Deklarace metody při opuštění objektu pro rozměr pole (TxtPocetPrvku_LostFocus)

Další metodou v regionu je metoda obsluhy události opuštění objektu TxtMinHodnota pro specifikaci dolní meze intervalu přípustných hodnot prvků vektoru - viz Kód 2. Po provedení konverze (v případě neprovedení konverze je do dolní meze uložena předdefinovaná hodnota pro typ int, tedy 0 - využití výstupního parametru out) je dolní mez testována, zda nepřekračuje hodnotu horní meze. Pokud ano, je dolní mez nastavena na hodnotu horní meze včetně zobrazení informace pro uživatele o této chybě pomocí dialogového okna. Hodnota dolní meze je také přepsána v objektu na formuláři. 

/// <summary>
/// Validace dolní meze intervalu přípustných hodnot prvků vektoru
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void TxtMinHodnota_LostFocus(object sender, RoutedEventArgs e)
{
    /* Přiřazení dolní meze z objektu na formuláři do datové složky třídy určující 
     * dolní mez intervalu přípustných hodnot */
    int.TryParse(this.TxtMinHodnota.Text, out this.minHodnota);
    // Pokud nová dolní mez je větší než stávající horní mez, pak...
    if (this.minHodnota > this.maxHodnota)
    {
        // Zobrazení dialogového okna s chybou a nastavení dolní meze na horní mez
        MessageBox.Show(String.Format("Chyba hodnoty dolní meze - dolní mez nastavena na horní mez: {0}", this.maxHodnota));
        // Dolní mez je nastavena na hodnotu horní meze
        this.minHodnota = this.maxHodnota;
        // Zobrazení hodnoty dolní meze na formuláři 
        this.TxtMinHodnota.Text = minHodnota.ToString();
    }
}

Kód 2: Deklarace metody při opuštění objektu pro dolní mez intervalu přístupných hodnot prvků vektoru (TxtMinHodnota_LostFocus)

Další podobnou metodou je metoda obsluhy události opuštění objektu TxtMaxHodnota pro specifikaci horní meze intervalu přípustných hodnot prvků vektoru - viz Kód 3. Princip metody je obdobný jako v předchozí metodě.

/// <summary>
/// Validace horní meze intervalu přípustných hodnot prvků vektoru
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void TxtMaxHodnota_LostFocus(object sender, RoutedEventArgs e)
{
    /* Přiřazení horní meze z objektu na formuláři do datové složky třídy určující 
     * horní mez intervalu hodnot, kterých mohou nabývat prvky ve vektoru */
    int.TryParse(this.TxtMaxHodnota.Text, out this.maxHodnota);
    // Pokud nová horní mez je menší než stávající dolní mez, pak...
    if (this.maxHodnota < this.minHodnota)
    {
        // Zobrazení dialogového okna s chybou a nastavení horní meze na dolní mez
        MessageBox.Show(String.Format("Chyba hodnoty horní meze - horní mez nastavena na dolní mez: {0}", this.minHodnota));
        // Horní mez je nastavena na hodnotu dolní meze
        this.maxHodnota = this.minHodnota;
        // Zobrazení hodnoty horní meze na formuláři
        this.TxtMaxHodnota.Text = maxHodnota.ToString();
    }
}

Kód 3: Deklarace metody při opuštění objektu pro horní mez intervalu přístupných hodnot prvků vektoru (TxtMaxHodnota_LostFocus)

Další metodou v regionu je metoda obsluhy události opuštění objektu TxtPrvekIndex pro specifikaci indexu prvku při ručním plnění vektoru - viz Kód 4. Po provedení konverze (v případě neprovedení konverze je do indexu uložena předdefinovaná hodnota pro typ int, tedy 0 - využití výstupního parametru out) je index testován, zda nepřekračuje počet prvků vektoru - 1 (index počátečního prvku je 0), nebo zda není menší než 0. Pokud ano, je index nastaven na horní přípustnou mez, tj. počet prvků - 1 a tato hodnota je vypsána do objektu na formuláři. Zároveň je provedeno zobrazení informace pro uživatele o této chybě pomocí dialogového okna. 

/// <summary>
/// Validace indexu prvku vektoru při ručním plnění
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void TxtPrvekIndex_LostFocus(object sender, RoutedEventArgs e)
{
    // Lokální proměnná: index - index prvku
    int index;
    // Uložení indexu prvku do lokální proměnné (konverze textu na celé číslo)
    int.TryParse(this.TxtPrvekIndex.Text, out index);
    /* Pokud index prvku je větší než počet prvků vektoru - 1, nebo index prvku je
     * menší než 0, pak... */
    if ((index > this.pocetPrvku-1) || (index < 0))
    {
        // Zobrazení dialogového okna s chybou a nastavení indexu na rozměr vektoru - 1
        MessageBox.Show(String.Format("Chybný index prvku. Index nastaven na horní mez: {0}", this.pocetPrvku-1));
        /* Přiřazení horní meze indexu do objektu na formuláři určujícího index prvku vektoru */
        this.TxtPrvekIndex.Text = String.Format("{0}", this.pocetPrvku-1);
    }
}

Kód 4: Deklarace metody při opuštění objektu pro specifikaci indexu při ručním plnění vektoru (TxtPrvekIndex_LostFocus)

Poslední metodou v regionu je metoda obsluhy události opuštění objektu TxtHodnota pro specifikaci hodnoty prvku určeného zadaným indexem při ručním plnění vektoru - viz Kód 5. Po provedení konverze je hodnota prvku testována, zda nepřekračuje horní mez intervalu přípustných hodnot prvků, nebo zda není menší než dolní mez intervalu. Pokud ano, je zadaná hodnota prvku v objektu na formuláři vymazána pomocí metody Clear objektu TxtHodnota. Zároveň uživateli v dialogovém okně zobrazena tato chyba, včetně výpisu dolní a horní meze intervalu přípustných hodnot prvků vektoru. 

/// <summary>
/// Validace hodnoty prvku vektoru při ručním plnění
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void TxtHodnota_LostFocus(object sender, RoutedEventArgs e)
{
    // Lokální proměnná: t - hodnota prvku
    int t;
    // Uložení hodnoty prvku do lokální proměnné (konverze textu na celé číslo)
    int.TryParse(this.TxtHodnota.Text, out t);
    /* Pokud hodnota prvku je větší než horní mez, nebo hodnota prvku je
     * menší než dolní mez intervalu hodnot ve vektoru, pak... */
    if ((t > this.maxHodnota) || (t < this.minHodnota))
    {
        // Zobrazení dialogového okna s textem chyby a hodnotami mezí
        MessageBox.Show(String.Format("Hodnota prvku není v intervalu: {0} až {1}", 
            this.minHodnota, this.maxHodnota));                
        // Vymázání obsahu objektu na formuláři s hodnotou prvku 
        this.TxtHodnota.Clear();
    }
}

Kód 5: Deklarace metody při opuštění objektu pro specifikaci hodnoty prvku při ručním plnění vektoru (TxtHodnota_LostFocus)

4.2. Plnění pole

Jak již název podkapitoly napovídá, nyní je zapotřebí definovat těla metod, která budou vektor plnit čísly. Region Události obsahuje další region s názvem Plnění pole, který obsahuje následující metody: 

  • BtnNahodne_Click
  • BtnJednotlive_Click
  • BtnNulovat_Click

Abychom mohli vektor naplnit náhodnými čísly pomocí stisku tlačítka, je zapotřebí nejprve deklarovat metodu, která bude v těle metody obsluhy stisknutí tlačítka volána. Tuto metodu deklarujeme v regionu Plnění pole, který je součástí regionu Pomocné metody. 

Takovou základní metodou je soukromá (private) metoda bez návratu (void) s názvem NahodnePole - viz Kód 1. Tato metoda obsahuje 4 formální parametry. Prvním parametrem je počet prvků pole (parametry jsou v metodě ponechány zejména z didaktických důvodů, protože např. počet prvků vektoru lze získat pomocí vlastnosti Length, atd.). Dalšími parametry je dolní a horní mez intervalu přípustných hodnot prvků. Posledním formálním parametrem je vektor. Je nutné si uvědomit, že ač se vektor jeví předávaný hodnotou, ve skutečnosti je předáván pouze odkaz, protože vektor není hodnotový typ, ale referenční typ. Tento vektor je zpočátku naplněn 0. My však budeme chtít, aby vektor obsahoval náhodná čísla z intervalu přípustných hodnot. To zajistíme pomocí vytvoření instance generátoru náhodného čísla s názvem rnd, pomocí zavolání konstruktoru s využitím klíčového slova new. Pomocí cyklu s pevným krokem zajistíme procházení prvků vektoru. V tomto cyklu budeme každému prvku na pozici i přiřazovat náhodné číslo v intervalu dolní a horní meze, které jsou metodě Next předány jako parametry. Nezapomeňte, že metoda generuje náhodné číslo ve zleva uzavřeném intervalu (může generovat náhodné číslo rovné dolní mezi) a zprava otevřeném (nemůže generovat číslo rovné horní mezi). Proto je zapotřebí přičíst k horní mezi 1, aby mohlo být generováno náhodné číslo rovné horní mezi - jedná se o celá čísla, protože vektor obsahuje pouze celá čísla, tj. typ int. 

/// <summary>
/// Metoda pro plnění prvků vektoru náhodnými čísly
/// </summary>
/// <param name="n"> počet prvků pole </param>
/// <param name="minh"> minimální celočíselná hodnota prvku </param>
/// <param name="maxh"> maximální celočíselná hodnota prvku </param>
/// <param name="pole"> jednorozměrné pole </param>
private void NahodnePole(int n, int minh, int maxh, int[] pole)
{
    // Vytvoření instance generátoru náhodného čísla
    Random rnd = new Random();
 
    // Cyklus s pevným krokem - pro procházení prvků vektoru
    for (int i = 0; i < n; i++)
    {
        // Přiřazení náhodného čísla v rozmezí intervalu u prvku na pozici [i]
        pole[i] = rnd.Next(minh, maxh + 1);
    }
}

Kód 1: Deklarace metody pro plnění vektoru náhodnými čísly (NahodnePole)

Vzhledem k tomu, že již máme deklarovánu metodu pro plnění, přejděme do regionu Události a dále do regionu Plnění pole, ve kterém nalezneme metodu BtnNahodne_Click, jejíž tělo budeme plnit - viz Kód 2. Tato metoda obsluhy události stisknutí tlačítka BtnNahodne, zajistí plnění vektoru náhodnými čísly v intervalu přípustných hodnot, jehož dolní a horní mez je specifikována na formuláři. Tyto hodnoty byly v těle hlavní metody naplněny do datových složek třídy minHodnota a maxHodnota. Jak vidíme v následujícím kódu v těle metody je volána soukromá metoda bez návratu s názvem NahodnePole, kterou jsme deklarovali v předchozím kódu. Skutečné parametry volané metody jsou počet prvků vektoru a již zmiňované meze. Samotný vektor bude ve volané metodě změněn, ale vzhledem k referenčnímu typu nemusíme používat předávání parametru odkazem.

/// <summary>
/// Volání metody pro plnění vektoru náhodnými čísly
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BtnNahodne_Click(object sender, RoutedEventArgs e)
{
    // Zavolání metody bez návratu pro plnění vektoru náhodnými čísly
    this.NahodnePole(this.pocetPrvku, this.minHodnota, this.maxHodnota, this.pole);
}

Kód 2: Deklarace metody pro zavolání metody pro plnění pole náhodnými čísly (BtnNahodne_Click)

V regionu Plnění pole, který je součástí regionu Události, také nalezneme metodu BtnJednotlive_Click, jejíž tělo nyní budeme doplňovat - viz Kód 3. Tato metoda obsluhy události stisknutí tlačítka BtnJednotlive, zajistí ruční plnění vektoru, tzn., že jednotlivé prvky bude definovat uživatel na formuláři a po stisknutí tlačítka bude prvek na definované pozici přepsán hodnotou načtenou z objektu na formuláři. Jak vidíme v následujícím kódu těla metody je nejprve provedena konverze textu na celé číslo z objektu na formuláři určeného pro specifikaci indexu prvku (počáteční prvek je indexován 0). Načtenou hodnotu uložíme do lokální proměnné poradiPrvku. Dále je zapotřebí načíst hodnotu, která má být umístěna do prvku vektoru. Mohlo by se stát, že uživatel by stiskl tlačítko pro ruční plnění, aniž by vyplnil hodnoty indexu prvku, nebo hodnoty prvku. Proto v metodě provedeme načtení hodnot z obou těchto objektů na formuláři a sestavíme podmínky, které budou testovat, zda byly zadány validní hodnoty (mohli bychom také namísto tohoto druhu testování např. pouze testovat, zda objekty na formuláři nejsou prázdné, atd.). Pokud index prvku je mimo interval povolených hodnot (je menší než 0, nebo větší než počet prvků - 1), je zobrazeno dialogové okno s textem popisujícím chybu. U objektu dialogového okna můžeme specifikací parametrů metody Show definovat, jaká tlačítka mají být v okně zobrazena (v našem případě pouze tlačítko OK) a jaký obrázek má být zobrazen vedle vypsaného textu (v našem případě chyba, tj. kříž v červeném kruhu).  

Pokud byla podmínka splněna (byl zadán validní index prvku), je testována další podmínka. Podmínka obsahuje testování, zda byla zadána validní hodnota prvku, tj. zda náleží intervalu přípustných hodnot. Pokud ne, je znovu zobrazeno dialogové okno s chybovou hláškou. 

Pokud jsou zadané hodnoty validní, provedou se příkazy v poslední větvi else. V prvním příkazu této větve vidíme, že hodnota uložená v lokální proměnné hodnota, je uložena do prvku, který je na pozici index. Protože byl přepsán prvek vektoru novou hodnotou, je vhodné změněný vektor zobrazit uživateli. To zajistíme pomocí volání metody ZobrazitPoleJakoText, která zobrazí prvek v objektu typu TextBox na formuláři. Dále pomocí metody ZobrazitPoleVListView zobrazíme vektor v objektu typu ListView. Popis zdrojového kódu v C# obou těchto metod naleznete v kapitole Zobrazení pole. 

V bloku rozhodování je umístěna podmínka, že pokud je index prvku menší než celkový počet prvků - 1 (rozměr vektoru je uložen v datové složce pocetPrvku), bude provedena inkrementace (zvýšení o 1) u indexu. Tím uživateli odpadá povinnost vždy specifikovat index následujícího prvku (které je o 1 vyšší než předchozí), protože se tak stane po stisku tlačítka. Index prvku pak vypíšeme v objektu na formuláři. 

/// <summary>
/// Metoda pro ruční plnění jednotlivých prvků vektoru
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BtnJednotlive_Click(object sender, RoutedEventArgs e)
{
    /* Přiřazení indexu prvku z objektu na formuláři (konverze textu na celé 
     * číslo) do lokální proměnné */
    int.TryParse(this.TxtPrvekIndex.Text, out int index);
 
    // Přiřazení hodnoty prvku z objektu na formuláři do lokální proměnné
    int.TryParse(this.TxtHodnota.Text, out int hodnota);
 
    /* Přiřazení dolní meze intervalu hodnoty prvku z objektu na formuláři
     * do lokální proměnné */
    int.TryParse(this.TxtMinHodnota.Text, out int minh);
    
    /* Přiřazení horní meze intervalu hodnoty prvku z objektu na formuláři
     * do lokální proměnné */
    int.TryParse(this.TxtMaxHodnota.Text, out int maxh);
 
    /* Pokud index prvku je mimo interval hodnot, tj. je menší než 0, 
     * nebo je větší než rozměr vektoru - 1, pak... */
    if ((index < 0) || (index > this.pocetPrvku - 1))
    {
        // Zobrazení varovného dialogového okna
        MessageBox.Show("Zadaná hodnota indexu prvku je mimo meze", "Chyba v zadání",
            MessageBoxButton.OK, MessageBoxImage.Error);
    }
    /* Pokud hodnota prvku je větší než horní mez intervalu povolené hodnoty prvku, nebo
     * je menší než dolní mez intervalu hodnot prvku, pak... */
    else if ((hodnota > maxh) || (hodnota < minh))
    {
        // Zobrazení varovného dialogového okna
        MessageBox.Show("Zadaná hodnota prvku je mimo meze", "Chyba v zadání",
            MessageBoxButton.OK, MessageBoxImage.Error);
    }
    // Jinak...
    else
    {
        /* Přiřazení hodnoty z lokální proměnné do prvku vektoru 
         * na pozici [index] */
        this.pole[index] = hodnota;
        // Zavolání metody pro zobrazení vektoru v objektu (typu TextBox) na formuláři
        this.ZobrazitPoleJakoText(this.pocetPrvku, this.pole);
        // Zavolání metody pro zobrazení vektoru do objektu (typu ListView) na formuláři
        this.ZobrazitPoleVListView(this.pole);
        // Pokud index prvku je menší než celkový počet prvků - 1, pak...
        if (index < this.pocetPrvku - 1)
        {
            // Zvýšení indexu prvku o 1
            index++;
            // Přiřazení indexu prvku do objektu na formuláři
            this.TxtPrvekIndex.Text = index.ToString();
        }
    }
}

Kód 3: Deklarace metody pro ruční plnění pole definovanými hodnotami uživatelem (BntJednotlive_Click)

Nyní budeme deklarovat poslední metodu v regionu Plnění pole, umístněného v regionu Pomocné metody. Jedná se o soukromou metodu bez návratu s názvem NulovatPole - viz Kód 4. Tato metoda pomocí cyklu s krokem bude procházet všechny prvky předaného vektoru a zajistí přepsání stávající hodnoty prvku hodnotou 0. 

/// <summary>
/// Metoda pro nulování hodnot ve vektoru
/// </summary>
/// <param name="n"> počet prvků vektoru (předání parametru hodnotou - pouze vstup) </param>
/// <param name="pole"> jednorozměrné pole </param>
private void NulovatPole(int n, int[] pole)
{
    // Cyklus s pevným krokem - pro procházení prvků
    for (int i = 0; i < n; i++)
    {
        // Přiřazení nuly prvku na pozici [i]
        pole[i] = 0;
    }
}

Kód 4: Deklarace metody pro přepsaní hodnot prvků hodnotou 0 u předaného pole (NulovatPole)

Po deklaraci metody pro plnění vektoru hodnotou 0, se přemístíme do regionu Události a dále do regionu Plnění pole, ve kterém nalezneme metodu BtnNulovat_Click, jejíž tělo budeme plnit - viz Kód 5. Tato metoda obsluhy události stisknutí tlačítka BtnNulovat, zajistí plnění vektoru nulami. Jak vidíme, v následujícím kódu v těle metody je volána soukromá metoda bez návratu s názvem NulovatPole, kterou jsme deklarovali v předchozím kódu. Skutečné parametry volané metody jsou počet prvků vektoru a samotný vektor.

/// <summary>
/// Metoda pro zavolání metody pro nulování vektoru
/// </summary>
private void BtnNulovat_Click(object sender, RoutedEventArgs e)
{
    //Zavolání metody pro nulování vektoru
    this.NulovatPole(this.pocetPrvku, this.pole);
}

Kód 5: Deklarace metody pro zavolání metody pro nulování jednorozměrného pole (BntNulovat_Click)

4.3. Zobrazení pole

Pojďme se nyní podívat na metody umístěné v regionu Zobrazení pole, který je součástí regionu Události, ve kterém jsou umístěny metody pro obsluhu událostí objektů formuláře. Tento region obsahuje následující metody: 

  • BtnVektorJakoText_Click
  • BtnDoMrizky_Click

Abychom mohli vektor zobrazit jako text v objektu typu TextBox, je zapotřebí převést jeho obsah na text. V regionu Zobrazení pole, který je součástí regionu Pomocné metody, budeme deklarovat metodu PoleJakoText, která navrací textový řetězec, který bude obsahovat hodnoty jednotlivých prvků, které budou vypsány v řadě za sebou. Hodnoty budou od sebe odděleny čárkou. 

V metodě deklarujeme pomocnou lokální proměnnou vystup, do níž budeme ukládat výstupní řetězec - viz Kód 1. Lokální proměnnou budeme inicializovat textem a zároveň hodnotou uloženou v prvním prvku. Využijeme metody Format, která nám převede číslo (indexováno 0 ve složené závorce) do specifikovaného formátu, tj. na 3 číslice  (formát D3). Tato metoda je součástí třídy (datového typu) string. 

V cyklu s krokem budeme procházet prvky od druhého prvku a výše (hodnotu prvního prvku jsme již vypsali při inicializaci). V těle cyklu znovu použijeme konverzi třídy string, ale s tím rozdílem, že před každé další číslo umístíme čárku.

/// <summary>
/// Prvky vektoru jsou převedeny na text a odděleny čárkou
/// </summary>
/// <param name="n"> počet prvků vektoru </param>
/// <param name="pole"> vektor (předání parametru hodnotou - vstup) </param>
/// <returns></returns>     
private string PoleJakoText(int n, int[] pole)
{
    /* Lokální proměnná: výstup - výsledek převodu na text - inicializace 
     * hodnotou počátečního prvku v požadovaném formátu */
    string vystup = "Vektor:" + string.Format(" {0:D3}", pole[0]);
 
    // Procházení prvků vektoru - od 2. do posledního prvku 
    for (int i = 1; i < n; i++)
    {
        // Převod hodnoty prvku na text včetně připojení čárky
        vystup += string.Format(", {0:D3}", pole[i]);
    }
    // Návrat výsledného řetězce
    return vystup;
}

Kód 1: Deklarace metody pro převod prvků předaného pole do textového řetězce - oddělení prvků čárkami (PoleJakoText)

Další metodou, kterou budeme muset přidat do stejného regionu, je metoda bez návratu, která zajistí zobrazení vektoru v objektu typu TextBox s názvem TxtVysledek, který je umístěn na formuláři - viz Kód 2. V těle metody budeme volat předchozí deklarovanou metodu PoleJakoText, které předáme hodnotou počet prvků a vektor. Výstupní řetězec, obdržený jako návrat volané metody, přiřadíme do vlastnosti Text objektu TxtVysledek. 

/// <summary>
/// Zobrazení vektoru na formuláři jako text v objektu TextBox
/// </summary>
/// <param name="n"> počet prvků vektoru </param>
/// <param name="pole"> vektor </param>
private void ZobrazitPoleJakoText(int n, int[] pole)
{
    // Výpis vektoru v objektu TextBox na formuláři
    this.TxtVysledek.Text = this.PoleJakoText(n, pole);
}

Kód 2: Deklarace metody pro zavolání metody pro převod prvků pole na textový řetězec (ZobrazitPoleJakoText)

Abychom přiřadili akci tlačítku, které spustí zobrazení vektoru jako text, přemístíme se do regionu Události a jeho části Zobrazení pole. V tomto regionu upravíme metodu obsluhy události stisknutí tlačítka BtnVektorJakoText, která bude volat předchozí metodu ZobrazitPoleJakoText - viz Kód 3. Této metodě předáme předáme parametry počet prvků vektoru a samotný vektor. 

/// <summary>
/// Volání metody pro zobrazení vektoru jako text v objektu typu TextBox na formuláři
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BtnVektorJakoText_Click(object sender, RoutedEventArgs e)
{
    // Zavolání metody pro zobrazení vektoru jako text v objektu na formuláři
    this.ZobrazitPoleJakoText(this.pocetPrvku, this.pole);
}

Kód 3: Deklarace metody pro zavolání metody pro zobrazení vektoru jako text v objektu na formuláři (BtnVektorJakoText_Click)

Další metodou, kterou budeme deklarovat v regionu Pomocné metody v regionu Zobrazení pole, je soukromá metoda bez návratu s názvem ZobrazitPoleVListView - viz Kód 4. V tomto případě je metodě předán parametr ve formě pole. U objektu typu ListView musíme kvůli zobrazení pole v tomto objektu přiřadit objektu zdroj (vlastnost ItemSource), který bude v tomto objektu zobrazen. Na začátku přiřadíme zdroji objektu ListView hodnotu null (prázdná hodnota), tím zajistíme vymazání předchozího obsahu zobrazeného v tomto objektu. Jako další krok přiřadíme pole do zdroje objektu na formuláři.

/// <summary>
/// Zobrazení prvků vektoru na formuláři v objektu ListView
/// </summary>
private void ZobrazitPoleVListView(int[] pole)
{
    // Vymazání předchozí textu - přiřazení prázdné hodnoty zdroji objektu
    this.LstVektor.ItemsSource = null;
    // Zobrazení vektoru v objektu na formuláři
    this.LstVektor.ItemsSource = pole;
}

Kód 4: Deklarace metody pro zobrazení prvků předaného pole v objektu typu ListView (ZobrazitPoleVListView)

Přemístíme se zpět do regionu Události a jeho části Zobrazení pole. V tomto regionu upravíme metodu obsluhy události stisknutí tlačítka BtnDoMrizky - viz Kód 5. V rámci těla metody budeme volat předchozí deklarovanou metodu ZobrazitPoleVListView, které předáme jako parametr vektor.

/// Volání metody pro zobrazení prvků vektoru v objektu typu ListView na formuláři
/// ListView na formuláři
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BtnDoMrizky_Click(object sender, RoutedEventArgs e)
{
    // Zavolání metody pro zobrazení prvků vektoru do mřížky na formuláři
    this.ZobrazitPoleVListView(this.pole);
}

Kód 5: Deklarace metody pro zavolání metody pro zobrazení vektoru v objektu typu ListView na formuláři (BtnDoMrizky_Click)

4.4. Operace s polem

Pojďme se nyní podívat na metody umístěné v regionu Operace s polem, který je součástí regionu Události, ve kterém jsou umístěny metody pro obsluhu událostí objektů formuláře. Tento region obsahuje následující metody: 

  • BtnMinimum_Click
  • BtnMaximum_Click
  • BtnPrumer_Click
  • BtnSeradit_Click

Pro přehlednost budou jednotlivé operace prováděné s prvky pole rozděleny a popsány v následujících kapitolách.

Nezapomínejme také na metodu pro zavření formuláře. Tato metoda obsluhy stisknutí tlačítka BtnKonec bude vypadat následovně - viz Kód 1. Metoda je taktéž umístěna v regionu Události. 

/// <summary>
/// Metoda pro zavření formuláře
/// </summary>
private void BtnKonec_Click(object sender, RoutedEventArgs e)
{
    // Zavření formuláře
    this.Close();
}

Kód 1: Deklarace metody bez návratu pro zavření formuláře (BtnKonec_Click)

4.5. Minimum a maximum pole

Abychom mohli ve vektoru nalézt jeho nejmenší prvek, tj. minimum, musíme nejprve deklarovat metodu, která bude prohledávat a porovnávat prvky vektoru. Proto v regionu Operace s polem, která je součástí regionu Pomocné metody, budeme deklarovat metodu MinimumVPoli, která navrací celočíselnou hodnotu minima, a zároveň má tato metoda výstupní parametr (uvozený klíčovým slovem out), který obsahuje index prvku představující minimum - viz Kód 1. 

V metodě je deklarována lokální proměnná minimum, do níž je uložena hodnota nejmenšího prvku vektoru. Počátečním krokem metody je prohlášení prvního prvku s indexem 0 minimem , tzn. do výstupního parametru musí být uložen indexu minima je uložena 0. Dále jsou v cyklu s krokem procházeny další prvky, které jsou porovnány s nejmenším dosud nalezeným prvkem, jehož hodnota je uložena v proměnné minimum. Podstata metody tkví v podmínce, že pokud aktuálně procházený prvek je menší než minimum, je hodnota tohoto prvku uložena do proměnné minimum. Po ukončení průchodu všemi prvky vektoru je hodnota minima přiřazena výstupu metody.

/// <summary>
/// Metoda pro hledání nejmenšího prvku ve vektoru
/// </summary>
/// <param name="n">  počet prvků vektoru </param>
/// <param name="pole"> vektor </param>
/// <param name="indPrvku"> index prvku minima </param>
/// <returns> celočíselná hodnota minima </returns>
private int MinimumVPoli(int n, int[] pole, out int indPrvku)
{
    // Lokální proměnné: i - index prvku; minimum - hodnota minima
    int minimum;
    // Přiřazení hodnoty počátečního prvku vektoru do minima
    minimum = pole[0];
    // Přiřazení hodnoty 0 do indexu prvku minima (kdyby byl počáteční prvek minimem)
    indPrvku = 0;
    // Cyklus s pevným krokem - pro procházení prvků
    for (int i = 1; i < n; i++)
    {
        /* Pokud je nalezen prvek ve vektoru, jehož hodnota je menší 
         * než minimum... */
        if (pole[i] < minimum)
        {
            // Uložení hodnoty nalezeného prvku do minima
            minimum = pole[i];
            // Přiřazení indexu aktuálního prvku do indexu minima
            indPrvku = i;
        }
    }
    // Přiřazení hodnoty nalezeného minima do výstupu metody
    return minimum;
}

Kód 1: Deklarace metody s návratem pro hledání minima vektoru včetně jeho pozice (MinimumVPoli)

Stejnou podstatu používá metoda MaximumVPoli, která však porovnává všechny prvky s dosud nejvyšší nalezenou hodnotu ve vektoru uloženou do proměnné s názvem maximum - viz Kód 2.

/// <summary>
/// Metoda pro hledání největšího prvku vektoru
/// </summary>
/// <param name="n">  počet prvků vektoru </param>
/// <param name="pole"> vektor </param>
/// <param name="indPrvku"> index prvku maxima </param>
/// <returns> celočíselná hodnota maxima </returns>
private int MaximumVPoli(int n, int[] pole, out int indPrvku)
{
    // Lokální proměnné: i - index prvku; maximum - hodnota maxima
    int maximum;
    // Přiřazení minimální možné hodnoty prvku vektoru do maxima
    maximum = int.MinValue;
    /* Přiřazení hodnoty 0 do indexu prvku maxima (nutné provést, jinak
     * kompilátor ohlásí chybu, že není přiřazena hodnota výstupnímu
     * prvku 'indPrvku' */
    indPrvku = 0;
    // Cyklus s pevným krokem - pro procházení prvků
    for (int i = 0; i < n; i++)
    {
        /* Pokud je nalezen prvek ve vektoru, jehož hodnota je větší 
         * než maximum, pak... */
        if (pole[i] > maximum)
        {
            // Uložení hodnoty nalezeného prvku do maxima
            maximum = pole[i];
            // Přiřazení indexu aktuálního prvku do indexu maxima
            indPrvku = i;
        }
    }
    // Přiřazení hodnoty nalezeného maxima do výstupu metody
    return maximum;
}

Kód 2: Deklarace metody s návratem pro hledání maxima vektoru včetně jeho pozice (MaximumVPoli)

Přemístíme se zpět do regionu Události a jeho části Operace s polem. V tomto regionu upravíme metodu obsluhy události stisknutí tlačítka BtnMinimum - viz Kód 3. V rámci těla metody budeme deklarovat lokální proměnnou minimum, do které uložíme návrat volané metody MinimumVPoli, které předáme tři parametry. První parametr je počet prvků vektoru uložený v datové složce třídy. Jako druhý parametr předáme vektor. Třetí výstupní parametr uvozený klíčovým slovem out představuje index nalezeného minima ve vektoru. Obdržené celočíselné hodnoty konvertujeme na text pomocí metody Format třídy string. Pro výpis hodnot použijeme indexaci prvků ve složených závorkách.

/// <summary>
/// Volání metody pro určení minima ve vektoru
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BtnMinimum_Click(object sender, RoutedEventArgs e)
{
    /* Lokální proměnné: indexMinima - index prvku minima ve vektoru;
     * minimum - hodnota minima ve vektoru */
    int minimum;
    /* Přiřazení výstupu metody pro určení minima do lokální proměnné a výstupní 
     * parametr určující index minima */
    minimum = this.MinimumVPoli(this.pocetPrvku, this.pole, out int indexMinima);
    /* Zobrazení textu spolu s hodnotou nejmenšího prvku a indexu prvku minima 
     * do objektu (TextBox) na formuláři */
    this.TxtVysledek.Text = string.Format("Minimum = {0} (index prvku = {1})", minimum, indexMinima);
}

Kód 3: Deklarace metody pro zavolání metody pro hledání minima a indexu tohoto minima - výpis na formuláři (BtnMinimum_Click)

Stejně jako u předchozí metody postupujeme v metodě BtnMaximum_Click umístěné ve stejném regionu - viz Kód 4.

/// <summary>
/// Volání metody pro určení maxima ve vektoru
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BtnMaximum_Click(object sender, RoutedEventArgs e)
{
    /* Lokální proměnné: indexMaxima - index prvku maxima ve vektoru;
     * maximum - hodnota maxima ve vektoru */
    int maximum;
    /* Přiřazení výstupu metody pro určení maxima do lokální proměnné a výstupní 
     * parametr určující pořadí maxima */
    maximum = this.MaximumVPoli(this.pocetPrvku, this.pole, out int indexMaxima);
    /* Zobrazení textu spolu s hodnotou nejmenšího prvku a indexem prvku maxima 
     * do objektu (TextBox) na formuláři */
    this.TxtVysledek.Text = string.Format("Maximum = {0} (index prvku = {1})", maximum, indexMaxima);
}

Kód 4: Deklarace metody pro zavolání metody pro hledání maxima a indexu tohoto maxima - výpis na formuláři (BtnMaximum_Click)

4.6. Průměr pole

Pro výpočet aritmetického průměru ze všech prvků v poli je použita soukromá metoda PrumerPole, která je deklarována v regionu Operace s polem, která je součástí regionu Pomocné metody. Tato metoda navrací reálné číslo reprezentující vypočtený průměr. Počátečním krokem metody je inicializace lokální celočíselné proměnné suma, která nám slouží pro uložení součtu všech dosud procházených prvků. Po ukončení průchodu všemi prvky vektoru je tato suma přetypována na reálné číslo (na typ double), abychom mohli provést podíl sumy a počtu prvků vektoru uloženým ve formálním parametru n jehož výsledek je desetinné číslo (jinak bychom prováděli celočíselné dělení). Výsledek této operace je přiřazen výstupu metody - viz Kód 1.

/// <summary>
/// Metoda pro výpočet aritmetického průměru prvků ve vektoru
/// </summary>
/// <param name="n"> počet prvků vektoru </param>
/// <param name="pole"> vektor </param>
/// <returns> hodnota aritmetického průměru (reálné číslo) </returns>
private double PrumerPole(int n, int[] pole)
{
    // Lokální proměnné: i - index; suma - suma prvků vektoru 
    int suma;
    // Nastavení počáteční hodnoty u sumy
    suma = 0;
    // Cyklus s pevným krokem - pro procházení prvků
    for (int i = 0; i < n; i++)
    {
        // Přičtení dalšího prvku vektoru do sumy
        suma += pole[i];
    }
    /* Výpočet průměru (suma/počet prvků) a přiřazení hodnoty do výstupu metody
     * nutné přetypovat sumu na double, aby nedošlo k celočíselnému dělení */
    return (double)suma / (n);
}

Kód 1: Deklarace metody pro výpočet aritmetického průměru prvků vektoru (PrumerPole)

Přemístíme se zpět do regionu Události a jeho části Operace s polem. V tomto regionu upravíme metodu obsluhy události stisknutí tlačítka BtnPrumer - viz Kód 2. V rámci těla metody budeme deklarovat reálnou lokální proměnnou prumer, do které uložíme návrat volané metody PrumerPole, které předáme dva parametry. První parametr je počet prvků vektoru uložený v datové složce třídy. Jako druhý parametr předáme vektor. Navrácený průměr zobrazíme v na formuláři v objektu typu TextBox spolu s textem. Pro konverzi reálného čísla na textový řetězec využijeme metody Format třídy string, kde použijeme indexaci prvků ve složených závorkách včetně uvedení formátu výpisu reálného čísla na dvě desetinná místa (N2).

/// <summary>
/// Volání metody pro výpočet aritmetického průměru z prvků pole
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BtnPrumer_Click(object sender, RoutedEventArgs e)
{
    // Lokální proměnná: prumer - průměr prvků v poli
    double prumer;
    // Přiřazení výstupu metody pro výpočet průměru z prvků pole do lokální proměnné
    prumer = this.PrumerPole(this.pocetPrvku, this.pole);
    /* Zobrazení textu 'Průměr = ' spolu s vypočteným průměrem (konverze reálného čísla 
     * na text, zobrazného na 2 desetinná místa) do objektu (TextBox) na formuláři */
    this.TxtVysledek.Text = string.Format("Průměr = {0:N2}", prumer);
}

Kód 2: Deklarace metody pro zavolání metody pro výpočet aritmetického průměru prvků pole - výpis na formuláři (BtnPrumer_Click)

4.7. Seřazení prvků pole

Pro seřazení prvků pole vzestupně je v regionu Operace s polem, která je součástí regionu Pomocné metody, volána soukromá metoda bez návratu s názvem SeraditPole. Tato metoda využívá třídění typu Bubble Sort, kde jsou porovnány jednotlivé dvojice sousedních prvků. Pokud je aktuálně procházený prvek větší než následující prvek, jsou tyto prvky vzájemně prohozeny. Pokud došlo alespoň k jednomu prohození sousedních prvků, celý vnitřní cyklus s krokem pro procházení od prvního do předposledního prvku je znovu opakován. Pokud nedošlo k prohození ani v jedné porovnávané dvojici sousedních prvků není již vnější cyklus s podmínkou na konci prováděn. Následující zdrojový kód obsahuje deklarace metody SeraditPole - viz Kód 1.

/// <summary>
/// Metoda pro vzestupné třídění prvků ve vektoru
/// </summary>
/// <param name="n"> počet prvků vektoru </param>
/// <param name="pole"> výstupní seřazený vektor </param>
private void SeraditPole(int n, int[] pole)
{
    /* Lokální proměnné: i - index ;  pom - pomocná proměnná pro prohození 
     * dvou prvků vektoru; b - booleanovská proměnná - informace, zda
     * došlo k prohození dvou sousedních prvků */
    int pom;
    bool b;
 
    // Opakuj tak dlouho, dokud bude docházet k prohození prvků vektoru
    do
    {
        // Nedošlo k prohození prvků vektoru
        b = false;
        // Cyklus s pevným krokem - pro procházení od počátečního do předposledního prvku
        for (int i = 0; i < n - 1; i++)
        {
            /* Pokud je hodnota sousedícího prvku větší než hodnota aktuálně
             * testovaného prvku, pak... */
            if (pole[i] > pole[i + 1])
            {
                // Ulož hodnotu aktuálního prvku do pomocné proměnné
                pom = pole[i];
                // Ulož hodnotu sousedícího prvku do aktuálního prvku
                pole[i] = pole[i + 1];
                // Ulož hodnotu z pomocné proměnné do sousedícího prvku
                pole[i + 1] = pom;
                // Došlo k prohození prvků
                b = true;
            }
        }
    }
    // Podmínka cyklu
    while (b); 
}

Kód 1: Deklarace metody s návratem pro vzestupné seřazení prvků vektoru (SeraditPole)

Přemístíme se zpět do regionu Události a jeho části Operace s polem. V tomto regionu upravíme metodu obsluhy události stisknutí tlačítka BtnSeradit - viz Kód 2. V rámci těla metody budeme volat předchozí deklarovanou metodu SeraditPole, které předáme dva parametry. První parametr je počet prvků vektoru uložený v datové složce třídy. Jako druhý parametr předáme vektor. Vzhledem k tomu, že v metodě bude upraven vektor, je vhodné tento změněný vektor uživateli zobrazit. Proto vektor zobrazíme jak do objektu typu TextBox, tak i do objektu typu ListView umístěných na formuláři. 

/// <summary>
/// Volání metody pro vzestupné třídění prvků vektoru
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BtnSeradit_Click(object sender, RoutedEventArgs e)
{
    // Zavolání metody pro vzestupné třídění prvků v poli
    this.SeraditPole(this.pocetPrvku, this.pole);
    // Zavolání metody pro zobrazení vektoru do objektu (TextBox) na formuláři
    this.ZobrazitPoleJakoText(this.pocetPrvku, this.pole);
    // Zavolání metody pro zobrazení vektoru v objektu (ListView) na formuláři
    this.ZobrazitPoleVListView(this.pole);
}

Kód 2: Deklarace metody pro zavolání metody vzestupného třídění prvků vektoru - výpis na formuláři (BtnSeradit_Click)

5. Výsledný kód

XAML kód

Výsledný XAML kód formuláře (MainWindow.xaml) - viz Kód 1.

<Window x:Class="JednorozmernePoleWPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:JednorozmernePoleWPF"
        mc:Ignorable="d"
        Title="Základní práce s vektorem" Height="600" Width="800" MinHeight="500" MinWidth="700">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <!-- Nastavení vektoru -->
        <GroupBox Header="Nastavení vektoru">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                </Grid.RowDefinitions>
                <Label Content="Vektor" FontSize="18" FontWeight="Bold" HorizontalAlignment="Center" />
                <Grid Grid.Row="1">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="Auto"/>
                    </Grid.ColumnDefinitions>
                    <!-- Rozměr vektoru -->
                    <GroupBox Header="Rozměr vektoru">
                        <WrapPanel>
                            <Label Content="Počet prvků:" VerticalAlignment="Center"/>
                            <TextBox Name="TxtPocetPrvku" Grid.Column="1" Width="100" Margin="5" Padding="5" 
                                     LostFocus="TxtPocetPrvku_LostFocus"/>
                        </WrapPanel>
                    </GroupBox>
                    <!-- Hodnoty - meze -->
                    <GroupBox Header="Hodnoty - meze" Grid.Column="1">
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="Auto"/>
                            </Grid.RowDefinitions>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="Auto"/>
                            </Grid.ColumnDefinitions>
                            <Label Content="Minimum:" VerticalAlignment="Center"/>
                            <TextBox Name="TxtMinHodnota" Grid.Column="1" Width="100" Margin="5" Padding="5" 
                                     LostFocus="TxtMinHodnota_LostFocus"/>
                            <Label Content="Maximum:" Grid.Row="1" VerticalAlignment="Center"/>
                            <TextBox Name="TxtMaxHodnota" Grid.Row="1" Grid.Column="1" Width="100" Margin="5" Padding="5"
                                     LostFocus="TxtMaxHodnota_LostFocus"/>
                        </Grid>
                    </GroupBox>
                    <!-- Prvek ve vektoru -->
                    <GroupBox Header="Prvek ve vektoru" Grid.Column="3">
                        <Grid  Margin="5">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="Auto"/>
                            </Grid.RowDefinitions>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="Auto"/>
                            </Grid.ColumnDefinitions>
                            <Label Content="Index:" Grid.Column="0"/>
                            <TextBox Name="TxtPrvekIndex" Grid.Column="1" Width="100" LostFocus="TxtPrvekIndex_LostFocus"/>
                            <Label Content="Hodnota:" Grid.Row="1" Grid.Column="0"/>
                            <TextBox Name="TxtHodnota" Grid.Row="1" Grid.Column="1" Width="100" LostFocus="TxtHodnota_LostFocus"/>
                        </Grid>
                    </GroupBox>
                </Grid>
            </Grid>
        </GroupBox>
        <!-- Zobrazení vektoru -->
        <GroupBox Header="Zobrazení vektoru" Grid.Row="1">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <!-- Vektor -->
                <GroupBox Header="Mřížka" Margin="5" MinHeight="100">
                    <ListView Name="LstVektor" ScrollViewer.VerticalScrollBarVisibility="Auto"/>
                </GroupBox>
                <!-- Výsledek -->
                <GroupBox Header="Jako text (nebo výpis výsledku)" Grid.Column="1" Margin="5">
                    <TextBox Name="TxtVysledek" Margin="5" ScrollViewer.HorizontalScrollBarVisibility="Visible" 
                             ScrollViewer.VerticalScrollBarVisibility="Visible" IsReadOnly="True" Background="AliceBlue"/>
                </GroupBox>
            </Grid>
        </GroupBox>
        <!-- Tlačítka - sekce: Plnit, Výstup, Výpočet -->
        <StackPanel Grid.Row="4">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <!-- Plnit -->
                <StackPanel >
                    <Label Content="Plnit:" FontWeight="Bold" FontSize="16" HorizontalAlignment="Center"/>
                    <Button Name="BtnNahodne" Content="Náhodně" Margin="5" Padding="10,5" Click="BtnNahodne_Click"/>
                    <Button Name="BtnJednotlive" Content="Jednotlivě" Margin="5" Padding="10,5" Click="BtnJednotlive_Click"/>
                    <Button Name="BtnNulovat" Content="Nulovat" Margin="5" Padding="10,5" Click="BtnNulovat_Click"/>
                </StackPanel>
                <!-- Výstup -->
                <StackPanel Grid.Column="1">
                    <Label Content="Výstup:" FontWeight="Bold" FontSize="16" HorizontalAlignment="Center"/>
                    <Button Name="BtnVektorJakoText" Content="Vektor jako text"  Margin="5" Padding="10,5" 
                            Click="BtnVektorJakoText_Click"/>
                    <Button Name="BtnDoMrizky" Content="Do mřížky" Margin="5" Padding="10,5" Click="BtnDoMrizky_Click"/>
                </StackPanel>
                <!-- Výpočet -->
                <StackPanel Grid.Column="2">
                    <Label Content="Výpočet:" FontWeight="Bold" FontSize="16" HorizontalAlignment="Center"/>
                    <Button Name="BtnMinimum" Content="Minimum"  Margin="5" Padding="10,5" Click="BtnMinimum_Click"/>
                    <Button Name="BtnMaximum" Content="Maximum" Margin="5" Padding="10,5" Click="BtnMaximum_Click"/>
                    <Button Name="BtnPrumer" Content="Průměr" Margin="5" Padding="10,5" Click="BtnPrumer_Click"/>
                    <Button Name="BtnSeradit" Content="Seřadit" Margin="5" Padding="10,5" Click="BtnSeradit_Click"/>
                </StackPanel>
            </Grid>
            <!-- Konec -->
            <WrapPanel HorizontalAlignment="Right">
                <Button Name="BtnKonec" Content="Konec" Margin="5" Width="100" Padding="5" Click="BtnKonec_Click"/>
            </WrapPanel>
        </StackPanel>
    </Grid>
</Window>

Kód 1: Výsledný XAML kód vytvořeného formuláře


C# kód

Code Behind - C# kód pro veškeré události vyvolané uživatelem při manipulaci s aplikací (MainWindow.xaml.cs) - viz Kód 2.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
 
namespace JednorozmernePoleWPF
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        #region Datové složky třídy (globální proměnné)
        // Specifikace konstanty a inicializace
        const int Max = 10;
        // Aktuální rozměr pole - počet prvků
        private int pocetPrvku;
        // Přípustná minimální hodnota (dolní mez) prvku - inicializace
        private int minHodnota = 1;
        // Přípustná maximální hodnota (horní mez) prvku - inicializace
        private int maxHodnota = 100;
 
        // Deklarace pole
        private int[] pole;
        #endregion Datové složky třídy
 
 
        public MainWindow()
        {
            InitializeComponent();
 
            /* Přiřazení maximálního rozměru vektoru do datové složky určující
             * počet prvků vektoru */
            this.pocetPrvku = Max;
 
            // Vytvoření instance (objektu) pole s definovanou délkou
            this.pole = new int[this.pocetPrvku];
 
            /* Přiřazení počtu prvků vektoru do objektu na formuláři určujícího
             * velikost vektoru*/
            this.TxtPocetPrvku.Text = this.pocetPrvku.ToString();
 
            /* Přiřazení přípustné minimální hodnoty prvku ve vektoru do objektu 
             * na formuláři určujícího mezní hodnotu */
            this.TxtMinHodnota.Text = this.minHodnota.ToString();
 
            /* přiřazení přípustné maximální hodnoty prvku ve vektoru do objektu (pole) 
             * na formuláři určujícího mezní hodnotu */
            this.TxtMaxHodnota.Text = this.maxHodnota.ToString();
        }
 
        #region Pomocné metody       
        #region Plnění pole
        /// <summary>
        /// Metoda pro plnění prvků vektoru náhodnými čísly
        /// </summary>
        /// <param name="n"> počet prvků pole </param>
        /// <param name="minh"> minimální celočíselná hodnota prvku </param>
        /// <param name="maxh"> maximální celočíselná hodnota prvku </param>
        /// <param name="pole"> jednorozměrné pole </param>
        private void NahodnePole(int n, int minh, int maxh, int[] pole)
        {
            // Vytvoření instance generátoru náhodného čísla
            Random rnd = new Random();
 
            // Cyklus s pevným krokem - pro procházení prvků vektoru
            for (int i = 0; i < n; i++)
            {
                // Přiřazení náhodného čísla v rozmezí intervalu u prvku na pozici [i]
                pole[i] = rnd.Next(minh, maxh + 1);
            }
        }
 
        /// <summary>
        /// Metoda pro nulování hodnot ve vektoru
        /// </summary>
        /// <param name="n"> počet prvků vektoru (předání parametru hodnotou - pouze vstup) </param>
        /// <param name="pole"> jednorozměrné pole </param>
        private void NulovatPole(int n, int[] pole)
        {
            // Cyklus s pevným krokem - pro procházení prvků
            for (int i = 0; i < n; i++)
            {
                // Přiřazení nuly prvku na pozici [i]
                pole[i] = 0;
            }
        }
        #endregion Plnění pole
 
        #region Zobrazení pole
        /// <summary>
        /// Prvky vektoru jsou převedeny na text a odděleny čárkou
        /// </summary>
        /// <param name="n"> počet prvků vektoru </param>
        /// <param name="pole"> vektor (předání parametru hodnotou - vstup) </param>
        /// <returns></returns>     
        private string PoleJakoText(int n, int[] pole)
        {
            /* Lokální proměnná: výstup - výsledek převodu na text - inicializace 
             * hodnotou počátečního prvku v požadovaném formátu */
            string vystup = "Vektor:" + string.Format(" {0:D3}", pole[0]);
 
            // Procházení prvků vektoru - od 2. do posledního prvku 
            for (int i = 1; i < n; i++)
            {
                // Převod hodnoty prvku na text včetně připojení čárky
                vystup += string.Format(", {0:D3}", pole[i]);
            }
            // Návrat výsledného řetězce
            return vystup;
        }
 
        /// <summary>
        /// Zobrazení vektoru na formuláři jako text v objektu TextBox
        /// </summary>
        /// <param name="n"></param>
        /// <param name="pole"></param>
        private void ZobrazitPoleJakoText(int n, int[] pole)
        {
            // Výpis vektoru v objektu typu TextBox na formuláři
            this.TxtVysledek.Text = this.PoleJakoText(n, pole);
        }
 
        /// <summary>
        /// Zobrazení prvků vektoru na formuláři v objektu ListView
        /// </summary>
        private void ZobrazitPoleVListView(int[] pole)
        {
            // Vymazání předchozí textu - přiřazení prázdné hodnoty zdroji objektu
            this.LstVektor.ItemsSource = null;
            // Zobrazení vektoru v objektu na formuláři
            this.LstVektor.ItemsSource = pole;
        }
        #endregion Zobrazení pole
 
        #region Operace s polem
        /// <summary>
        /// Metoda pro hledání nejmenšího prvku ve vektoru
        /// </summary>
        /// <param name="n">  počet prvků vektoru </param>
        /// <param name="pole"> vektor </param>
        /// <param name="indPrvku"> index prvku minima </param>
        /// <returns> celočíselná hodnota minima </returns>
        private int MinimumVPoli(int n, int[] pole, out int indPrvku)
        {
            // Lokální proměnné: i - index prvku; minimum - hodnota minima
            int minimum;
            // Přiřazení hodnoty počátečního prvku vektoru do minima
            minimum = pole[0];
            // Přiřazení hodnoty 0 do indexu prvku minima (kdyby byl počáteční prvek minimem)
            indPrvku = 0;
            // Cyklus s pevným krokem - pro procházení prvků
            for (int i = 1; i < n; i++)
            {
                /* Pokud je nalezen prvek ve vektoru, jehož hodnota je menší 
                 * než minimum... */
                if (pole[i] < minimum)
                {
                    // Uložení hodnoty nalezeného prvku do minima
                    minimum = pole[i];
                    // Přiřazení indexu aktuálního prvku do indexu minima
                    indPrvku = i;
                }
            }
            // Přiřazení hodnoty nalezeného minima do výstupu metody
            return minimum;
        }
 
        /// <summary>
        /// Metoda pro hledání největšího prvku vektoru
        /// </summary>
        /// <param name="n">  počet prvků vektoru </param>
        /// <param name="pole"> vektor </param>
        /// <param name="indPrvku"> index prvku maxima </param>
        /// <returns> celočíselná hodnota maxima </returns>
        private int MaximumVPoli(int n, int[] pole, out int indPrvku)
        {
            // Lokální proměnné: i - index prvku; maximum - hodnota maxima
            int maximum;
            // Přiřazení minimální možné hodnoty prvku vektoru do maxima
            maximum = int.MinValue;
            /* Přiřazení hodnoty 0 do indexu prvku maxima (nutné provést, jinak
             * kompilátor ohlásí chybu, že není přiřazena hodnota výstupnímu
             * prvku 'indPrvku' */
            indPrvku = 0;
            // Cyklus s pevným krokem - pro procházení prvků
            for (int i = 0; i < n; i++)
            {
                /* Pokud je nalezen prvek ve vektoru, jehož hodnota je větší 
                 * než maximum, pak... */
                if (pole[i] > maximum)
                {
                    // Uložení hodnoty nalezeného prvku do maxima
                    maximum = pole[i];
                    // Přiřazení indexu aktuálního prvku do indexu maxima
                    indPrvku = i;
                }
            }
            // Přiřazení hodnoty nalezeného maxima do výstupu metody
            return maximum;
        }
 
        /// <summary>
        /// Metoda pro výpočet aritmetického průměru prvků ve vektoru
        /// </summary>
        /// <param name="n"> počet prvků vektoru </param>
        /// <param name="pole"> vektor </param>
        /// <returns> hodnota aritmetického průměru (reálné číslo) </returns>
        private double PrumerPole(int n, int[] pole)
        {
            // Lokální proměnné: i - index; suma - suma prvků vektoru 
            int suma;
            // Nastavení počáteční hodnoty u sumy
            suma = 0;
            // Cyklus s pevným krokem - pro procházení prvků
            for (int i = 0; i < n; i++)
            {
                // Přičtení dalšího prvku vektoru do sumy
                suma += pole[i];
            }
            /* Výpočet průměru (suma/počet prvků) a přiřazení hodnoty do výstupu metody
             * nutné přetypovat sumu na double, aby nedošlo k celočíselnému dělení */
            return (double)suma / (n);
        }
 
        /// <summary>
        /// Metoda pro vzestupné třídění prvků ve vektoru
        /// </summary>
        /// <param name="n"> počet prvků vektoru </param>
        /// <param name="pole"> výstupní seřazený vektor </param>
        private void SeraditPole(int n, int[] pole)
        {
            /* Lokální proměnné: i - index ;  pom - pomocná proměnná pro prohození 
             * dvou prvků vektoru; b - booleanovská proměnná - informace, zda
             * došlo k prohození dvou sousedních prvků */
            int pom;
            bool b;
 
            // Opakuj tak dlouho, dokud bude docházet k prohození prvků vektoru
            do
            {
                // Nedošlo k prohození prvků vektoru
                b = false;
                // Cyklus s pevným krokem - pro procházení od počátečního do předposledního prvku
                for (int i = 0; i < n - 1; i++)
                {
                    /* Pokud je hodnota sousedícího prvku větší než hodnota aktuálně
                     * testovaného prvku, pak... */
                    if (pole[i] > pole[i + 1])
                    {
                        // Ulož hodnotu aktuálního prvku do pomocné proměnné
                        pom = pole[i];
                        // Ulož hodnotu sousedícího prvku do aktuálního prvku
                        pole[i] = pole[i + 1];
                        // Ulož hodnotu z pomocné proměnné do sousedícího prvku
                        pole[i + 1] = pom;
                        // Došlo k prohození prvků
                        b = true;
                    }
                }
            }
            // Podmínka cyklu
            while (b); 
        }
        #endregion Operace s polem
        #endregion Pomocné metody
 
 
        #region Události
        #region Nastavení atributů pole
        /// <summary>
        /// Validace rozměru vektoru
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void TxtPocetPrvku_LostFocus(object sender, RoutedEventArgs e)
        {
            // Lokální proměnná pro uložení nového počtu prvků vektoru
            int novaHodnota;
            /* Přiřazení počtu prvků z objektu na formuláři do lokální proměnné
             * určující počet prvků vektoru */
            int.TryParse(this.TxtPocetPrvku.Text, out novaHodnota);
            /* Pokud počet prvků je větší než maximální rozměr vektoru, nebo počet
             * prvků vektoru je menší než 1, pak... */
            if ((novaHodnota > Max) || (novaHodnota < 1))
            {
                /* Zobrazení dialogového okna s textem "Chyba velikosti vektoru" a hodnoty 
                 * max. rozměru vektoru */
                MessageBox.Show(String.Format("Chyba velikosti vektoru, nastavení na max. rozměr: {0}", Max));
                /* Přiřazení maximálního rozměru vektoru do lokální proměnné určující
                 * počet prvků vektoru */
                novaHodnota = Max;
                /* Přiřazení maximálního rozměru vektoru do objektu na formuláři
                 * určující počet prvků vektoru */
                this.TxtPocetPrvku.Text = Max.ToString();
            }
 
            // Pokud nový rozměr vektoru není stejný jako stávající počet prvků vektoru, pak...
            if (novaHodnota != this.pocetPrvku)
            {
                // Uložení nového rozměru pole do datové složky třídy
                this.pocetPrvku = novaHodnota;
                // Vytvoření nové instance pole s novým rozměrem
                this.pole = new int[this.pocetPrvku];
                // Zavolání metody pro zobrazení vektoru do objektu ListView na formuláři
                this.ZobrazitPoleVListView(this.pole);
                // Zavolání metody pro zobrazení vektoru do objektu TextBox na formuláři
                this.ZobrazitPoleJakoText(novaHodnota, this.pole);
            }
        }
 
        /// <summary>
        /// Validace dolní meze intervalu přípustných hodnot prvků vektoru 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void TxtMinHodnota_LostFocus(object sender, RoutedEventArgs e)
        {
            /* Přiřazení dolní meze z objektu na formuláři do datové složky třídy určující 
             * dolní mez intervalu přípustných hodnot */
            int.TryParse(this.TxtMinHodnota.Text, out this.minHodnota);
            // Pokud nová dolní mez je větší než stávající horní mez, pak...
            if (this.minHodnota > this.maxHodnota)
            {
                // Zobrazení dialogového okna s chybou a nastavení dolní meze na horní mez
                MessageBox.Show(String.Format("Chyba hodnoty dolní meze - dolní mez nastavena na horní mez: {0}", this.maxHodnota));
                // Dolní mez je nastavena na hodnotu horní meze
                this.minHodnota = this.maxHodnota;
                // Zobrazení hodnoty dolní meze na formuláři 
                this.TxtMinHodnota.Text = minHodnota.ToString();
            }
        }
 
        /// <summary>
        /// Validace horní meze intervalu přípustných hodnot prvků vektoru 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void TxtMaxHodnota_LostFocus(object sender, RoutedEventArgs e)
        {
            /* Přiřazení horní meze z objektu na formuláři do datové složky třídy určující 
             * horní mez intervalu hodnot, kterých mohou nabývat prvky ve vektoru */
            int.TryParse(this.TxtMaxHodnota.Text, out this.maxHodnota);
            // Pokud nová horní mez je menší než stávající dolní mez, pak...
            if (this.maxHodnota < this.minHodnota)
            {
                // Zobrazení dialogového okna s chybou a nastavení horní meze na dolní mez
                MessageBox.Show(String.Format("Chyba hodnoty horní meze - horní mez nastavena na dolní mez: {0}", this.minHodnota));
                // Horní mez je nastavena na hodnotu dolní meze
                this.maxHodnota = this.minHodnota;
                // Zobrazení hodnoty horní meze na formuláři
                this.TxtMaxHodnota.Text = maxHodnota.ToString();
            }
        }
 
        /// <summary>
        /// Validace indexu prvku vektoru při ručním plnění
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void TxtPrvekIndex_LostFocus(object sender, RoutedEventArgs e)
        {
            // Lokální proměnná: index - index prvku
            int index;
            // Uložení indexu prvku do lokální proměnné (konverze textu na celé číslo)
            int.TryParse(this.TxtPrvekIndex.Text, out index);
            /* Pokud index prvku je větší než počet prvků vektoru - 1, nebo index prvku je
             * menší než 0, pak... */
            if ((index > this.pocetPrvku-1) || (index < 0))
            {
                // Zobrazení dialogového okna s chybou a nastavení indexu na rozměr vektoru - 1
                MessageBox.Show(String.Format("Chybný index prvku. Index nastaven na horní mez: {0}", this.pocetPrvku-1));
                /* Přiřazení horní meze indexu do objektu na formuláři určujícího index prvku vektoru */
                this.TxtPrvekIndex.Text = String.Format("{0}", this.pocetPrvku-1);
            }
        }
 
        /// <summary>
        /// Validace hodnoty prvku vektoru při ručním plnění
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void TxtHodnota_LostFocus(object sender, RoutedEventArgs e)
        {
            // Lokální proměnná: t - hodnota prvku
            int t;
            // Uložení hodnoty prvku do lokální proměnné (konverze textu na celé číslo)
            int.TryParse(this.TxtHodnota.Text, out t);
            /* Pokud hodnota prvku je větší než horní mez, nebo hodnota prvku je
             * menší než dolní mez intervalu hodnot ve vektoru, pak... */
            if ((t > this.maxHodnota) || (t < this.minHodnota))
            {
                // Zobrazení dialogového okna s textem chyby a hodnotami mezí
                MessageBox.Show(String.Format("Hodnota prvku není v intervalu: {0} až {1}", 
                    this.minHodnota, this.maxHodnota));                
                // Vymázání obsahu objektu na formuláři s hodnotou prvku 
                this.TxtHodnota.Clear();
            }
        }
        #endregion Nastavení atributů pole
 
        #region Plnění pole
        /// <summary>
        /// Volání metody pro plnění vektoru náhodnými čísly
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void BtnNahodne_Click(object sender, RoutedEventArgs e)
        {
            // Zavolání metody bez návratu pro plnění vektoru náhodnými čísly
            this.NahodnePole(this.pocetPrvku, this.minHodnota, this.maxHodnota, this.pole);
        }
 
        /// <summary>
        /// Metoda pro ruční plnění jednotlivých prvků vektoru
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void BtnJednotlive_Click(object sender, RoutedEventArgs e)
        {
            /* Přiřazení indexu prvku z objektu na formuláři (konverze textu na celé 
             * číslo) do lokální proměnné */
            int.TryParse(this.TxtPrvekIndex.Text, out int index);
 
            // Přiřazení hodnoty prvku z objektu na formuláři do lokální proměnné
            int.TryParse(this.TxtHodnota.Text, out int hodnota);
 
            /* Přiřazení dolní meze intervalu hodnoty prvku z objektu na formuláři
             * do lokální proměnné */
            int.TryParse(this.TxtMinHodnota.Text, out int minh);
            
            /* Přiřazení horní meze intervalu hodnoty prvku z objektu na formuláři
             * do lokální proměnné */
            int.TryParse(this.TxtMaxHodnota.Text, out int maxh);
 
            /* Pokud index prvku je mimo interval hodnot, tj. je menší než 0, 
             * nebo je větší než rozměr vektoru - 1, pak... */
            if ((index < 0) || (index > this.pocetPrvku - 1))
            {
                // Zobrazení varovného dialogového okna
                MessageBox.Show("Zadaná hodnota indexu prvku je mimo meze", "Chyba v zadání",
                    MessageBoxButton.OK, MessageBoxImage.Error);
            }
            /* Pokud hodnota prvku je větší než horní mez intervalu povolené hodnoty prvku, nebo
             * je menší než dolní mez intervalu hodnot prvku, pak... */
            else if ((hodnota > maxh) || (hodnota < minh))
            {
                // Zobrazení varovného dialogového okna
                MessageBox.Show("Zadaná hodnota prvku je mimo meze", "Chyba v zadání",
                    MessageBoxButton.OK, MessageBoxImage.Error);
            }
            // Jinak...
            else
            {
                /* Přiřazení hodnoty z lokální proměnné do prvku vektoru 
                 * na pozici [index] */
                this.pole[index] = hodnota;
                // Zavolání metody pro zobrazení vektoru v objektu (typu TextBox) na formuláři
                this.ZobrazitPoleJakoText(this.pocetPrvku, this.pole);
                // Zavolání metody pro zobrazení vektoru do objektu (typu ListView) na formuláři
                this.ZobrazitPoleVListView(this.pole);
                // Pokud index prvku je menší než celkový počet prvků - 1, pak...
                if (index < this.pocetPrvku - 1)
                {
                    // Zvýšení indexu prvku o 1
                    index++;
                    // Přiřazení indexu prvku do objektu na formuláři
                    this.TxtPrvekIndex.Text = index.ToString();
                }
            }
        }
 
        /// <summary>
        /// Metoda pro zavolání metody pro nulování vektoru
        /// </summary>
        private void BtnNulovat_Click(object sender, RoutedEventArgs e)
        {
            //Zavolání metody pro nulování vektoru
            this.NulovatPole(this.pocetPrvku, this.pole);
        }
        #endregion Plnění pole
 
        #region Zobrazení pole
        /// <summary>
        /// Volání metody pro zobrazení vektoru jako text v objektu typu TextBox na formuláři
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void BtnVektorJakoText_Click(object sender, RoutedEventArgs e)
        {
            // Zavolání metody pro zobrazení vektoru jako text v objektu na formuláři
            this.ZobrazitPoleJakoText(this.pocetPrvku, this.pole);
        }
 
        /// <summary>
        /// Volání metody pro zobrazení prvků vektoru v objektu typu ListView na formuláři
        /// ListView na formuláři
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void BtnDoMrizky_Click(object sender, RoutedEventArgs e)
        {
            // Zavolání metody pro zobrazení prvků vektoru do mřížky na formuláři
            this.ZobrazitPoleVListView(this.pole);
        }
        #endregion Zobrazení pole
 
        #region Operace s polem
        /// <summary>
        /// Volání metody pro určení minima ve vektoru
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void BtnMinimum_Click(object sender, RoutedEventArgs e)
        {
            /* Lokální proměnné: indexMinima - index prvku minima ve vektoru;
             * minimum - hodnota minima ve vektoru */
            int minimum;
            /* Přiřazení výstupu metody pro určení minima do lokální proměnné a výstupní 
             * parametr určující index minima */
            minimum = this.MinimumVPoli(this.pocetPrvku, this.pole, out int indexMinima);
            /* Zobrazení textu spolu s hodnotou nejmenšího prvku a indexu prvku minima 
             * do objektu (TextBox) na formuláři */
            this.TxtVysledek.Text = string.Format("Minimum = {0} (index prvku = {1})", minimum, indexMinima);
        }
 
        /// <summary>
        /// Volání metody pro určení maxima ve vektoru
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void BtnMaximum_Click(object sender, RoutedEventArgs e)
        {
            /* Lokální proměnné: indexMaxima - index prvku maxima ve vektoru;
             * maximum - hodnota maxima ve vektoru */
            int maximum;
            /* Přiřazení výstupu metody pro určení maxima do lokální proměnné a výstupní 
             * parametr určující pořadí maxima */
            maximum = this.MaximumVPoli(this.pocetPrvku, this.pole, out int indexMaxima);
            /* Zobrazení textu spolu s hodnotou nejmenšího prvku a indexem prvku maxima 
             * do objektu (TextBox) na formuláři */
            this.TxtVysledek.Text = string.Format("Maximum = {0} (index prvku = {1})", maximum, indexMaxima);
        }
 
        /// <summary>
        /// Volání metody pro výpočet aritmetického průměru z prvků pole
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void BtnPrumer_Click(object sender, RoutedEventArgs e)
        {
            // Lokální proměnná: prumer - průměr prvků v poli
            double prumer;
            // Přiřazení výstupu metody pro výpočet průměru z prvků pole do lokální proměnné
            prumer = this.PrumerPole(this.pocetPrvku, this.pole);
            /* Zobrazení textu 'Průměr = ' spolu s vypočteným průměrem (konverze reálného čísla 
             * na text, zobrazného na 2 desetinná místa) do objektu (TextBox) na formuláři */
            this.TxtVysledek.Text = string.Format("Průměr = {0:N2}", prumer);
        }
 
        /// <summary>
        /// Volání metody pro vzestupné třídění prvků vektoru
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void BtnSeradit_Click(object sender, RoutedEventArgs e)
        {
            // Zavolání metody pro vzestupné třídění prvků v poli
            this.SeraditPole(this.pocetPrvku, this.pole);
            // Zavolání metody pro zobrazení vektoru do objektu (TextBox) na formuláři
            this.ZobrazitPoleJakoText(this.pocetPrvku, this.pole);
            // Zavolání metody pro zobrazení vektoru v objektu (ListView) na formuláři
            this.ZobrazitPoleVListView(this.pole);
        }
        #endregion Operace s polem
 
        /// <summary>
        /// Metoda pro zavření formuláře
        /// </summary>
        private void BtnKonec_Click(object sender, RoutedEventArgs e)
        {
            // Zavření formuláře
            this.Close();
        }
        #endregion Události
    }
}

Kód 2: Výsledný C# kód vytvořeného formuláře a metod jeho prvků


6. Výstup programu

Na následujících výstupech týkajících se programu JednorozmernePoleWPF budou zobrazeny jednotlivé výstupy aplikace pro různá nastavení atributů vektoru a případy plnění jednorozměrného pole včetně jednotlivých operací prováděných s prvky tohoto pole.  

Rozměr pole

Pokud uživatel nastavil rozměr pole mimo povolené hranice, je o této chybě informován pomocí dialogového okna a počet prvků je nastaven na maximální rozměr, tj. na konstantu Max - viz Výstup programu 1. 


Výstup programu 1 - Kód 1 a 2 (viz kapitola 5 Výsledný kód): Překročení maximální velikosti pole

Dolní a horní mez prvků

Pokud uživatel zadal dolní mez větší než horní mez, dolní mez bude nastavena na hodnotu horní meze - viz Výstup programu 2. V opačném případu, pokud uživatel zadal horní mez menší než dolní mez, bude horní mez nastavena no dolní mez.


Výstup programu 2 - Kód 1 a 2 (viz kapitola 5 Výsledný kód): Změna velikosti dolní meze, která je větší než horní mez

Plnění pole

Vzhledem k možnosti plnění pole různými způsoby jsou v následujících odstavcích zobrazeny různé varianty týkající se plnění vektorů. Pole je vypsáno jak do řádku v objektu typu TextBox s titulkem Jako text (nebo výpis výsledku), tak i do sloupce pod sebou do objektu typu ListView s titulkem Mřížka.

Náhodná čísla

V následujícím výřezu výstupu programu vidíme variantu plnění pole o velikosti 10 prvků náhodnými celými čísly - viz Výstup programu 3.  Dolní mez prvků pole je nastavena na hodnotu 1 a horní mez na hodnotu 100.


Výstup programu 3 - Kód 1 a 2 (viz kapitola 5 Výsledný kód): Plnění pole náhodnými čísly

Plnění jednotlivých prvků pole

Další možností plnění pole je plnění prvku na základě specifikace indexu prvku a specifikace jeho hodnoty - viz Výstup programu 4. Před počátečním plněním jednotlivých prvků jsou všechny prvky inicializovány počáteční hodnotou v závislosti na příslušném datovém typu (pro datový typ int je přednastavená hodnota 0). Na výstupu programu vidíme postupné plnění celočíselného pole o 10 prvcích, kde po každém naplnění prvku je pole vypsáno v objektech na formuláři. Při naplnění prvku je automaticky zvedán index prvku o 1, aby jej uživatel nemusel přepisovat. 

Výstup programu 4 - Kód 1 a 2 (viz kapitola 5 Výsledný kód): Ruční plnění pomocí specifikace indexu a hodnoty prvku

Plnění nulami

Třetí možností plnění pole je všem prvkům přiřadit hodnotu 0. Následující výstupu programu znázorňuje výpis pole o velikosti 10 prvků, kde jsou všechny prvky naplněny nulami - viz Výstup programu 5. 


Výstup programu 5 - Kód 1 a 2 (viz kapitola 5 Výsledný kód): Plnění všech prvků nulami

Minimum a maximum pole

Následující výstupy programu WPF aplikace ilustrují nalezení minima (viz Výstup programu 6) a maxima (viz Výstup programu 7) v poli o 10 prvcích. Ve výpisu v objektu typu TextBox s titulkem Jako text (nebo výpis výsledku), je uvedeno i pořadí těchto dvou nalezených prvků. Pole bylo plněny náhodnými čísly (stejné pole jako ve Výstup programu 3) v rozmezí celočíselných hodnot 1 ÷ 100.


Výstup programu 6 - Kód 1 a 2 (viz kapitola 5 Výsledný kód): Nalezené minimum v poli včetně indexu minima


Výstup programu 7 - Kód 1 a 2 (viz kapitola 5 Výsledný kód): Nalezené maximum v poli včetně indexu maxima

Průměr pole

Následující výstup programu aplikace ilustruje výpočet aritmetického průměru pole o 10 prvcích. Tyto prvky byly plněny náhodnými čísly (stejné pole jako ve Výstup programu 3) v rozmezí celočíselných hodnot 1 ÷ 100. Průměr pole je uveden v objektu typu TextBox s titulkem Jako text (nebo výpis výsledku) - viz Výstup programu 8.


Výstup programu 8 - Kód 1 a 2 (viz kapitola 5 Výsledný kód): Výpočet aritmetického průměru ze všech prvků pole

Seřazení prvků pole

Poslední výstup programu ilustruje seřazení prvků pole podle jejich hodnot ve vzestupném pořadí. Pole o 10 prvcích bylo naplněno náhodnými čísly (stejné pole jako ve Výstup programu 3) v rozmezí celočíselných hodnot 1 ÷ 100. Seřazené pole je vypsáno jak do řádku v objektu typu TextBox s titulkem Jako text (nebo výpis výsledku), tak i do sloupce pod sebou do objektu typu ListView s titulkem Mřížka - viz Výstup programu 9. 


Výstup programu 9 - Kód 1 a 2 (viz kapitola 5 Výsledný kód): Seřazení všech prvků pole vzestupně