/// <summary>
        /// Vrátí seřazený výpis všech InBitů načtených z XML.
        /// To se hodí jako přehled před přidáváním dalších Ovládání a vstupů do rozsáhlejších XML souborů.
        /// </summary>
        /// <returns></returns>
        public string VypisInBitu()
        {
            SortedList <int, string> vstupyView = new SortedList <int, string>();

            foreach (Object obj in Ovladanis) //vstupy z kolekce ovládání
            {
                Ovladani ovl = (obj as Ovladani);
                if (ovl != null)
                {
                    foreach (Senzor sens in ovl.Senzory1)
                    {
                        vstupyView.Add(sens.InBit, String.Format("({0} - ovládání {1} {2})", sens.Nazev, ovl.Nazev, ovl.Popis));
                    }
                    foreach (Senzor sens in ovl.Senzory2)
                    {
                        vstupyView.Add(sens.InBit, String.Format("({0} - ovládání {1} {2})", sens.Nazev, ovl.Nazev, ovl.Popis));
                    }
                }
            }

            foreach (Input inp in Inputs)
            {
                vstupyView.Add(inp.InBit, String.Format("({0} {1})", inp.Nazev, inp.Popis));
            }


            StringBuilder sb = new StringBuilder();

            foreach (KeyValuePair <int, string> vstupView in vstupyView)
            {
                sb.AppendLine(String.Format("{0}: {1}", vstupView.Key, vstupView.Value));
            }
            return(sb.ToString());
        }
        //Reakce na stisknutí buttonu výstupu levým tlačítkem myši
        private void Button2_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            Ovladani ovladani = ((FrameworkElement)sender).DataContext as Ovladani;

            ovladani.vystup1.Value = false;
            ovladani.vystup2.Value = true;
        }
        /// <summary>
        /// Vytvoření senzoru pro objekt Ovládání na základě načteného XML elementu
        /// </summary>
        /// <param name="element"></param>
        /// <param name="ovladani"></param>
        /// <param name="xmlFile"></param>
        private void vytvoreniSenzoru(XElement element, ref Ovladani ovladani, string xmlFile)
        {
            string errMessage = "";

            try
            {
                errMessage = "Atribut \"InBit\" nebyl nalezen, nebo má špatnou hodnotu. ";  //Kontrola přítomnosti všech povinných atributů v elementu XML souboru
                int inBit = int.Parse(element.Attribute("InBit").Value);
                errMessage = "Atribut \"Name\" nebyl nalezen. ";
                string name = element.Attribute("Name").Value;

                errMessage = "Nepodařili se vytvořit objekt \"senzor\"";
                Senzor senzor = new Senzor(inBit, name);  //Vytvoření senzoru ovládání
                if (element.Name == "Senzor1")
                {
                    ovladani.Senzory1.Add(senzor);
                }
                if (element.Name == "Senzor2")
                {
                    ovladani.Senzory2.Add(senzor);
                }

                errMessage = "U seznoru \"" + name + "\" ovládání \"" + ovladani.Nazev + "\" byla nalezena duplicitní hodnota pořadového čísla vstupního bitu (Hodnoty \"inBit1\" musí mít v celém XML souboru jedinečnou hodnotu)";
                senzory.Add(inBit, senzor);
            }
            catch (Exception ex)
            {
                throw new Exception("Při načítání textů ze souboru \"" + xmlFile + "\" nastala chyba. " + "\n" + errMessage + "\n" + ex.Message);
            }
        }
        /// <summary>
        /// Vytvoření jednoho objektu Ovládání na základě načteného XML elementu
        /// </summary>
        /// <param name="OutoutElement"></param>
        private void vytvoreniOvladani(XElement element, ref Ovladani ovladani, string xmlFile)
        {
            string errMessage = "";

            try
            {
                errMessage = "Atribut \"OutBit1\" nebyl nalezen, nebo má špatnou hodnotu. ";  //Kontrola přítomnosti všech povinných atributů v elementu XML souboru
                int outBit1 = int.Parse(element.Attribute("OutBit1").Value);
                errMessage = "Atribut \"OutBit2\" nebyl nalezen, nebo má špatnou hodnotu. ";
                int outBit2 = int.Parse(element.Attribute("OutBit2").Value);
                errMessage = "Atribut \"Text1\" nebyl nalezen. ";
                string text1 = element.Attribute("Text1").Value;
                errMessage = "Atribut \"Text2\" nebyl nalezen. ";
                string text2 = element.Attribute("Text2").Value;
                errMessage = "Atribut \"Name\" nebyl nalezen. ";
                string name = element.Attribute("Name").Value;
                errMessage = "Atribut \"Popis\" nebyl nalezen. ";
                string popis = element.Attribute("Popis").Value;
                errMessage = "Nepodařili se vytvořit objekt \"ovladani\"";
                ovladani   = new Ovladani(outBit1, outBit2, text1, text2, name, popis); //Vytvoření ovládání
                errMessage = "U ovládání \"" + name + "\" byla nalezena duplicitní hodnota pořadového čísla výstupního bitu (Hodnoty \"outBit1\" společně s \"outBit2\" musí mít v celém XML souboru jedinečnou hodnotu)";
                vystupy.Add(outBit1, ovladani.vystup1);
                vystupy.Add(outBit2, ovladani.vystup2);
                ovladanis.Add(ovladani);
            }
            catch (Exception ex)
            {
                throw new Exception("Při načítání textů ze souboru \"" + xmlFile + "\" nastala chyba. " + "\n" + errMessage + "\n" + ex.Message);
            }
        }
        /// <summary>
        /// Načtení "Ovladani" z XML souboru
        /// </summary>
        /// <param name="xmlFile"></param>
        private void nacistOvladani(string xmlFile)
        {
            Ovladani  ovladani = null;
            XDocument xmlXDoc;

            try
            {
                xmlXDoc = XDocument.Load(xmlFile);
            }
            catch (Exception ex)
            {
                throw new Exception("Chyba při načítání textů ze souboru \"" + xmlFile + ". " + ex.Message);
            }
            var query = from c in xmlXDoc.Elements("Data").Descendants() select c;

            foreach (XElement element in query)
            {
                if (element.Name == "Ovladani")
                {
                    vytvoreniOvladani(element, ref ovladani, xmlFile);
                }
                if (element.Name == "Senzor1" | element.Name == "Senzor2")
                {
                    vytvoreniSenzoru(element, ref ovladani, xmlFile);
                }
                if (element.Name == "Separator")
                {
                    vytvoreniSeparatoru(element, xmlFile);
                }
            }
        }
        //Reakce na kliknutí na 2. button
        private void Button2_Click(object sender, RoutedEventArgs e)
        {
            Ovladani ovladani = ((FrameworkElement)sender).DataContext as Ovladani;

            ovladani.vystup1.Value = false;
            ovladani.vystup2.Value = true;
            ovladani.UvolnitVystupy();
        }
        /// <summary>
        /// Ovládání šipkami klávesnice
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Ovladani_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            Object item = ((FrameworkElement)sender).DataContext as Object;

            if (item is Ovladani)
            {
                Ovladani ovladani = ((FrameworkElement)sender).DataContext as Ovladani;
                if (e.Key == Key.Left)
                {
                    ovladani.vystup1.Value = true;
                    ovladani.vystup2.Value = false;
                    ovladani.UvolnitVystupy();
                }
                if (e.Key == Key.Right)
                {
                    ovladani.vystup1.Value = false;
                    ovladani.vystup2.Value = true;
                    ovladani.UvolnitVystupy();
                }
            }
        }
        /// <summary>
        /// Vrátí seřazený výpis všech OutBitů načtených z XML.
        /// To se hodí jako přehled před přidáváním dalších Ovládání do rozsáhlejších XML souborů.
        /// </summary>
        /// <returns></returns>
        public string VypisOutBitu()
        {
            SortedList <int, string> vystupyView = new SortedList <int, string>();

            foreach (Object obj in Ovladanis)
            {
                Ovladani ovl = (obj as Ovladani);
                if (ovl != null)
                {
                    vystupyView.Add(ovl.vystup1.OutBit, String.Format("({0} {1} {2})", ovl.Text1, ovl.Nazev, ovl.Popis));
                    vystupyView.Add(ovl.vystup2.OutBit, String.Format("({0} {1} {2})", ovl.Text2, ovl.Nazev, ovl.Popis));
                }
            }

            StringBuilder sb = new StringBuilder();

            foreach (KeyValuePair <int, string> vystupView in vystupyView)
            {
                sb.AppendLine(String.Format("{0}: {1}", vystupView.Key, vystupView.Value));
            }
            return(sb.ToString());
        }
        //Reakce na uvolnění buttonu výstupu levým tlačítkem myši
        private void Button_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            Ovladani ovladani = ((FrameworkElement)sender).DataContext as Ovladani;

            ovladani.UvolnitVystupy();
        }