2. PovrchObjemKouleWPF

2.5. Výsledný kód

XAML kód

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

<Window x:Class="PovrchObjemKouleWPF.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:PovrchObjemKouleWPF"
        mc:Ignorable="d"
        Title="Povrch a objem koule" Height="250" Width="700" MinWidth="500" MinHeight="200">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
 
        <GroupBox Header="Specifikace" Grid.Row="0" Margin="10,20">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"/>
                    <ColumnDefinition Width="3*"/>
                    <ColumnDefinition Width="Auto"/>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="Auto"/>
                    <ColumnDefinition Width="4*"/>
                </Grid.ColumnDefinitions>
                <Label Content="Poloměr koule:" Grid.Row="0" Grid.Column="0" Margin="5" />
                <TextBox Name="TxtPolomer" Grid.Row="0" Grid.Column="1" VerticalContentAlignment="Center" Margin="5" TextWrapping="Wrap" Grid.ColumnSpan="2" GotFocus="TxtPolomer_GotFocus" LostFocus="TxtPolomer_LostFocus"/>
 
                <Label Content="Povrch koule:" Grid.Row="0" Grid.Column="4" Margin="5" />
                <TextBox Name="TxtPovrch" Grid.Row="0" Grid.Column="5" IsReadOnly="True" Background="AliceBlue" Margin="5"/>
 
                <Label Content="Objem koule:" Grid.Row="1" Grid.Column="4" Margin="5" />
                <TextBox Name="TxtObjem" Grid.Row="1" Grid.Column="5" IsReadOnly="True" Background="AliceBlue" Margin="5"/>
            </Grid>
        </GroupBox>
        <StackPanel Grid.Row="2">
            <WrapPanel HorizontalAlignment="Center">
                <Button Name="BtnMetoda" Content="Metoda" Margin="5" Click="BtnMetoda_Click"/>
                <Button Name="BtnMetodaNavrat" Content="Metoda - návrat" Margin="5" Click="BtnMetodaNavrat_Click"/>
                <Button Name="BtnMetodaVyraz" Content="Metoda - výraz" Margin="5" Click="BtnMetodaVyraz_Click" />
                <Button Name="BtnMetodaParametry" Content="Metoda - výstupní parametry" Margin="5" Click="BtnMetodaParametry_Click"/>
                <Button Name="BtnMetoda2Navraty" Content="Metoda - 2 návraty" Margin="5" Click="BtnMetoda2Navraty_Click"/>
                <Button Name="BtnMetodaReference" Content="Metoda - reference" Margin="5" Click="BtnMetodaReference_Click"/>
            </WrapPanel>
            <WrapPanel HorizontalAlignment="Right" >
                <Button Name="BtnKonec" Content="Konec" Margin="5" Width="80" 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 PovrchObjemKouleWPF
{
    /// <summary>
    /// Statická třída obsahující deklarace konstant
    /// </summary>
    static class Constants
    {
        //Deklarace a inicializace datové složky třídy
        public const string ZadPolomer = "Zadejte poloměr";
    }
 
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            //Při spuštění aplikace je vypsán text v prvku s poloměrem koule 
            this.TxtPolomer.Text = Constants.ZadPolomer; 
        }
 
        #region Výpočty
 
        /// <summary>
        /// Metoda s návratem pro výpočet povrchu koule
        /// </summary>
        /// <param name="r"> poloměr koule - vstupní parametr metody (předán hodnotou) </param>
        /// <returns> výstup metody je povrch koule </returns>
        private double PovrchKouleMetodaSNavratem(double r)
        {
            //Návrat vypočteného povrchu 
            return 4 * Math.PI * Math.Pow(r, 2);
        }
 
        /// <summary>
        /// Výpočet objemu koule
        /// </summary>
        /// <param name="r"> poloměr koule </param>
        /// <returns> objem koule </returns>
        private double ObjemKouleMetodaSNavratem(double r)
        {
            //Návrat vypočteného objemu 
            return (4d / 3) * Math.PI * Math.Pow(r, 3);
        }
 
        /// <summary>
        /// Metoda orientovaná na výraz pro výpočet povrchu koule
        /// </summary>
        /// <param name="r"> poloměr koule </param>
        /// <returns> povrch koule </returns>
        private double PovrchKouleMetodaVyraz(double r) => 4 * Math.PI * r * r;
 
        /// <summary>
        /// Metoda orientovaná na výraz pro výpočet objemu koule
        /// </summary>
        /// <param name="r"> poloměr koule </param>
        /// <returns> objem koule </returns>
        private double ObjemKouleMetodaVyraz(double r) => (4d / 3) * Math.PI * Math.Pow(r, 3);
 
        /// <summary>
        /// Metody s výstupními parametry pro výpočet povrchu a objemu koule
        /// </summary>
        /// <param name="r">  poloměr koule - vstupní parametr </param>
        /// <param name="s"> povrch koule - první výstupní parametr </param>
        /// <param name="v"> objem koule - druhý výstupní parametr </param>
        private void PovrchObjemKouleVystupniParametry(double r, out double s, out double v)
        {
            s = 4 * Math.PI * r * r;
            v = ((double)4 / 3) * Math.PI * Math.Pow(r, 3);
        }
 
 
        /// <summary>
        /// Metoda navracející 2 výstupy - povrch a objem koule
        /// </summary>
        /// <param name="r"> poloměr koule </param>
        /// <returns> povrch, objem - výstupy metody jsou typu double </returns>
        private (double, double) PovrchObjemKouleMetodaDvaNavraty(double r)
        {
            double s, v;
            s = 4 * Math.PI * r * r;
            v = (4d / 3) * Math.PI * Math.Pow(r, 3);
            return (s, v);
        }
 
        /// <summary>
        /// Metoda bez návratu - předání parametrů odkazem (povrch a objem koule)
        /// </summary>
        /// <param name="r"> poloměr koule - parametr předaný hodnotou </param>
        /// <param name="s"> povrch koule - parametr předaný odkazem </param>
        /// <param name="v"> povrch koule - parametr předaný odkazem </param>
        private void PovrchObjemKoulePredaniOdkazem(double r, ref double s, ref double v)
        {
            //Výpočet povrchu koule
            s = 4 * Math.PI * r * r;
            //Výpočet objemu koule
            v = (4d / 3) * Math.PI * Math.Pow(r, 3);
        }
 
        #endregion
 
 
 
        #region Události
 
        //Vymazání počátečního textu v objektu pro poloměr při zacílení objektu
        private void TxtPolomer_GotFocus(object sender, RoutedEventArgs e)
        {
            //Pokud je umístěn počáteční text "Zadejte poloměr" v objektu pro poloměr 
            if (this.TxtPolomer.Text == Constants.ZadPolomer)
            {
                //Vymazání textu v objektu pro poloměr
                this.TxtPolomer.Text = string.Empty;
            }
        }
 
        //Vyplnění počátečního textu v objektu pro poloměr při opuštění objektu
        private void TxtPolomer_LostFocus(object sender, RoutedEventArgs e)
        {
            //Pokud je objekt poloměru prázdný (neobsahuje text)
            if (this.TxtPolomer.Text == string.Empty)
            {
                //Vyplnění poloměru textem "Zadejte poloměr"
                this.TxtPolomer.Text = Constants.ZadPolomer;
                //Vymazání předchozího povrchu koule
                this.TxtPovrch.Text = "";
                //Vymazání předchozího objemu koule
                this.TxtObjem.Text = "";
            }
        }
 
        //Metoda bez návratu pro výpočet povrchu a objemu koule bez volání metod
        private void BtnMetoda_Click(object sender, RoutedEventArgs e)
        {
            // Deklarace lokálních proměnných: 's' ... plocha koule; 'v' ... objem koule
            double s, v;
 
            //Pokud lze provést konverzi textu (stringu) na reálné číslo pro hodnotu poloměru, pak...
            if (double.TryParse(this.TxtPolomer.Text, out double r)) 
            {
                //Výpočet povrchu pomocí konstanty PI (třída Math)
                s = 4 * Math.PI * r * r;
                //Výpočet objemu - přetypování na datový typ double; Pow - metoda pro umocnění
                v = ((double)4 / 3) * Math.PI * Math.Pow(r, 3);
 
                //Konverze reálného čísla (uloženého v lokální proměnné) na text(string)
                this.TxtPovrch.Text = s.ToString();
                //Konverze reálného čísla na text
                this.TxtObjem.Text = v.ToString(); 
            }
            //jinak...
            else
            {
                /* Zobrazení okna se zprávou (1. parametr - text v okně; 2. parametr - titulek okna; 3. parametr - s jedním 
                 * tlačítkem pro zavírání; 4. parametr - s ikonou varování) - minimálně 1 parametr povinný */
                MessageBox.Show("Zadejte číslo ve správném formátu!", "Chyba", MessageBoxButton.OK, MessageBoxImage.Warning);
                //Příkaz pro špatné zadání poloměru - zacílení na objekt poloměru koule
                this.TxtPolomer.Focus(); 
            }
        }
 
        //Metoda bez návratu pro výpočet povrchu a objemu koule s voláním metod s návratem
        private void BtnMetodaNavrat_Click(object sender, RoutedEventArgs e)
        {
            //Pokud lze provést konverzi textu(stringu) na reálné číslo pro hodnotu poloměru, pak...
            if (double.TryParse(this.TxtPolomer.Text, out double r)) 
            {
                /* Zavolání metody s návratem pro výpočet povrchu koule, která má 1 vstup(r) a 1 výstup - konverze 
                 * výstupního reálného čísla na text(string) */
                this.TxtPovrch.Text = PovrchKouleMetodaSNavratem(r).ToString();
                /* Zavolání metody s návratem pro výpočet objemu koule, která má 1 vstup(r) a 1 výstup - konverze 
                 * výstupního reálného čísla na text(string) */
                this.TxtObjem.Text = ObjemKouleMetodaSNavratem(r).ToString(); 
            }
            //jinak...
            else
            {
                //Okno se zprávou
                MessageBox.Show("Zadejte číslo ve správném formátu!", "Chyba", MessageBoxButton.OK, MessageBoxImage.Warning);
                //Zacílení na objekt poloměru koule
                this.TxtPolomer.Focus();
            }
        }
 
        //Metoda bez návratu pro výpočet povrchu a objemu koule s voláním metod orientovaných na výraz
        private void BtnMetodaVyraz_Click(object sender, RoutedEventArgs e)
        {
            //Pokud lze provést konverzi textu na reálné číslo pro hodnotu poloměru, pak...
            if (double.TryParse(this.TxtPolomer.Text, out double r))
            {
                /* Volání metody orientované na výraz pro výpočet povrchu koule, která má 1 vstup(r) a 
                 * 1 výstup - konverze výstupního reálného čísla na text(string) v požadovaném fomátu */
                this.TxtPovrch.Text = string.Format("{0:N2}", PovrchKouleMetodaVyraz(r));
                /* Volání metody orientované na výraz pro výpočet objemu koule, která má 1 vstup(r) a 
                 * 1 výstup - konverze výstupního reálného čísla na text(string) v požadovaném fomátu */
                this.TxtObjem.Text = string.Format("{0:N2}", ObjemKouleMetodaVyraz(r)); 
            }
            //jinak...
            else
            {
                //Okno se zprávou
                MessageBox.Show("Zadejte číslo ve správném formátu!", "Chyba", MessageBoxButton.OK, MessageBoxImage.Warning);
                //Zacílení na objekt poloměru koule
                this.TxtPolomer.Focus();
            }
        }
 
        //Metoda bez návratu pro výpočet povrchu a objemu koule s voláním metod s výstupními parametry
        private void BtnMetodaParametry_Click(object sender, RoutedEventArgs e)
        {
            //Pokud lze provést konverzi textu na reálné číslo pro hodnotu poloměru, pak...
            if (double.TryParse(this.TxtPolomer.Text, out double r))
            {
                //Volání metody s výstupními parametry, která má 1 vstupní parametr (r) a 2 výstupní parametry (s,v) 
                PovrchObjemKouleVystupniParametry(r, out double s, out double v);
                //Zobrazení vypočteného povrchu (konverze reálného čísla na text(string))
                this.TxtPovrch.Text = s.ToString();
                //Zobrazení vypočteného objemu
                this.TxtObjem.Text = v.ToString(); 
            }
            //jinak...
            else
            {
                //Okno se zprávou
                MessageBox.Show("Zadejte číslo ve správném formátu!", "Chyba", MessageBoxButton.OK, MessageBoxImage.Warning);
                //Zacílení na objekt poloměru koule
                this.TxtPolomer.Focus(); 
            }
        }
 
        //Metoda bez návratu pro výpočet povrchu a objemu koule s voláním metody navracející dva výstupy
        private void BtnMetoda2Navraty_Click(object sender, RoutedEventArgs e)
        {
            // Deklarace lokálních proměnných: 's' ... plocha koule; 'v' ... objem koule
            double s, v;
 
            //Pokud lze provést konverzi textu na reálné číslo pro hodnotu poloměru, pak...
            if (double.TryParse(this.TxtPolomer.Text, out double r)) 
            {
                //Volání metody navracející 2 výstupy (povrch, objem koule)
                (s, v) = PovrchObjemKouleMetodaDvaNavraty(r);
                //Zobrazení vypočteného povrchu uloženého v lokální proměnné 's' (konverze reálného čísla na text(string))
                this.TxtPovrch.Text = string.Format("{0:N2}", s);
                //Zobrazení vypočteného objemu uloženého v lokální proměnné 'v' (konverze reálného čísla na text(string))
                this.TxtObjem.Text = string.Format("{0:N2}", v); 
            }
            //jinak...
            else
            {
                //Okno se zprávou
                MessageBox.Show("Zadejte číslo ve správném formátu!", "Chyba", MessageBoxButton.OK, MessageBoxImage.Warning);
                //Zacílení na objekt poloměru koule
                this.TxtPolomer.Focus(); 
            }
        }
 
        //Metoda bez návratu pro výpočet povrchu a objemu koule s voláním metody, které jsou předány parametry odkazem
        private void BtnMetodaReference_Click(object sender, RoutedEventArgs e)
        {
            // Deklarace lokálních proměnných: 's' ... plocha koule; 'v' ... objem koule
            double s, v;
 
            //Pokud lze provést konverzi textu na reálné číslo pro hodnotu poloměru, pak...
            if (double.TryParse(this.TxtPolomer.Text, out double r))
            {
                //Inicializace proměnných, tj. počáteční přiřazení hodnoty
                s = v = 0;
                //Volání metody bez návratu - předání parametru 'r' hodnotou a předání parametrů 's' a 'v' odkazem
                PovrchObjemKoulePredaniOdkazem(r, ref s, ref v);
                //Zobrazení vypočteného povrchu uloženého v lokální proměnné 's' (konverze reálného čísla na text(string))
                this.TxtPovrch.Text = string.Format("{0:N2}", s);
                //Zobrazení vypočteného objemu uloženého v lokální proměnné 'v' (konverze reálného čísla na text(string))
                this.TxtObjem.Text = string.Format("{0:N2}", v);
            }
            //jinak...
            else
            {
                //Okno se zprávou
                MessageBox.Show("Zadejte číslo ve správném formátu!", "Chyba", MessageBoxButton.OK, MessageBoxImage.Warning);
                //Zacílení na objekt poloměru koule
                this.TxtPolomer.Focus();
            }
        }
 
        //Metoda bez návratu pro zavření formuláře
        private void BtnKonec_Click(object sender, RoutedEventArgs e)
        {
            //zavření formuláře
            this.Close();
        }
 
        #endregion
    }
}

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


Výstup programu

Na následujícím obrázku vidíme výstup naší aplikace pro výpočet povrchu a objemu koule ze zadaného poloměru na formuláři - viz Výstup programu - Kód 1 a 2. Různé typy metod pro výpočet povrchu a objemu koule jsou spouštěny pomocí příslušných tlačítek. U metod jsou také použity různé typy formátování výsledků. Aplikaci lze ukončit pomocí tlačítka Konec, nebo pomocí zavíracího tlačítka umístěného v pravém rohu aplikace.


Výstup programu - Kód 1 a 2: Výpis vypočteného povrchu a objemu koule ze zadaného poloměru