public MainWindow()
        {
            InitializeComponent();

            // noch keine map geladen / erstellt
            currentMap = null;
            StatusLabel.Content = "Programm gestartet";
        }
        public bool SaveToFile(Map _toSave, string _saveFile)
        {
            try
            {
                // gibt es den ordner nicht? => nicht speichern
                // if (!Directory.Exists(_saveDir)) { return false; }

                using(Stream outStream =
                    File.Open(
                        _saveFile,
                        FileMode.Create,
                        FileAccess.Write))
                {
                    using(BinaryWriter writer = new BinaryWriter(outStream, Encoding.Unicode))
                    {
                        WriteHeader(_toSave, writer);
                        WriteImages(_toSave, writer);
                    }
                }

                // speichern hat funktionert
                return true;
            }
            // sollte ein fehler auftreten
            catch (Exception)
            {
                // datei loeschen
                if (File.Exists(_saveFile)) { File.Delete(_saveFile); }

                // signalisieren dass das speichern nicht funktionert hat
                return false;
            }
        }
        public Map LoadFromFile(string _saveFile)
        {
            try
            {
                using(Stream inStream = File.Open(_saveFile, FileMode.Open, FileAccess.Read))
                {
                    using(BinaryReader reader = new BinaryReader(inStream, Encoding.Unicode))
                    {
                        int version = reader.ReadInt32();

                        if(version != SerVersion)
                        {
                            version = -1;
                            // altes dateiformat
                            inStream.Seek(0, SeekOrigin.Begin);
                        }

                        string name = reader.ReadString();
                        int height = reader.ReadInt32();
                        int width = reader.ReadInt32();
                        int tileHeight = 50;
                        int tileWidth = 50;

                        if(version != -1)
                        {
                            tileHeight = reader.ReadInt32();
                            tileWidth = reader.ReadInt32();
                        }

                        Map map = new Map(name, width, height, tileWidth, tileHeight);

                        // zeile fuer zeile
                        for (int y = 0; y < map.Height; ++y)
                        {
                            for (int x = 0; x < map.Width; ++x)
                            {
                                // die tile ID mit dem reader auslesen
                                map.Tiles[x, y] = reader.ReadInt32();
                            }
                        }

                        // solange noch daten im stream sind
                        while(inStream.Position < inStream.Length)
                        {
                            // laenge und daten des bildes laden
                            int length = reader.ReadInt32();
                            byte[] data = reader.ReadBytes(length);

                            using(MemoryStream memory = new MemoryStream(data))
                            {
                                // bild dekodieren
                                BitmapDecoder decoder = BitmapDecoder.Create(
                                    memory,
                                    BitmapCreateOptions.None,
                                    BitmapCacheOption.OnLoad
                                    );

                                // bild aus dem decoder der map hinzufuegen
                                map.images.Add(decoder.Frames.First());
                            }

                        }

                        return map;
                    }
                }
            }
            catch (Exception)
            {
                return null;
            }
        }
        private void WriteImages(Map _toSave, BinaryWriter _writer)
        {
            // ueber alle bilder iterieren
            foreach (var image in _toSave.images)
            {
                using(MemoryStream memory = new MemoryStream())
                {
                    // erstellt einen encoder im format des (urspruenglichen) bildes
                    BitmapEncoder encoder = BitmapEncoder.Create(image.Decoder.CodecInfo.ContainerFormat);

                    // das bild dem encoder hinzufuegen
                    encoder.Frames.Add(image);

                    // das bild kodieren und in den stream schreiben
                    encoder.Save(memory);

                    // bild aus dem memorystream holen
                    byte[] imageAsBytes = memory.ToArray();

                    // groesse des bildes schreiben
                    _writer.Write(imageAsBytes.Length);

                    // bild selbst schreiben
                    _writer.Write(imageAsBytes);
                }
            }
        }
        private void WriteHeader(Map _toSave, BinaryWriter _writer)
        {
            _writer.Write(SerVersion);
            _writer.Write(_toSave.Name);

            // Hoehe und breite schreiben
            _writer.Write(_toSave.Height);
            _writer.Write(_toSave.Width);

            _writer.Write(_toSave.TileHeight);
            _writer.Write(_toSave.TileWidth);

            // zeile fuer zeile
            for(int y = 0; y < _toSave.Height; ++y)
            {
                for(int x = 0; x < _toSave.Width; ++x)
                {
                    // alle tiles mit dem writer schreiben
                    _writer.Write(_toSave.Tiles[x, y]);
                }
            }
        }
        public Map LoadFromFile(string _saveFile)
        {
            try
            {
                using (Stream inStream = File.Open(_saveFile, FileMode.Open, FileAccess.Read))
                {
                    using (BinaryReader reader = new BinaryReader(inStream, Encoding.Unicode))
                    {
                        int version = reader.ReadInt32();

                        if (version != SerVersion)
                        {
                            version = -1;
                            // altes dateiformat
                            inStream.Seek(0, SeekOrigin.Begin);
                        }

                        string name = reader.ReadString();
                        int height = reader.ReadInt32();
                        int width = reader.ReadInt32();
                        int tileHeight = 50;
                        int tileWidth = 50;

                        if (version != -1)
                        {
                            tileHeight = reader.ReadInt32();
                            tileWidth = reader.ReadInt32();
                        }

                        Map map = new Map(name, width, height, tileWidth, tileHeight);

                        // zeile fuer zeile
                        for (int y = 0; y < map.Height; ++y)
                        {
                            for (int x = 0; x < map.Width; ++x)
                            {
                                // die tile ID mit dem reader auslesen
                                map.Tiles[x, y] = reader.ReadInt32();
                            }
                        }

                        // solange noch daten im stream sind
                        while (inStream.Position < inStream.Length)
                        {
                            // laenge und daten des bildes laden
                            int length = reader.ReadInt32();
                            byte[] data = reader.ReadBytes(length);

                            Texture2D tex = new Texture2D(4, 4);

                            if(!tex.LoadImage(data))
                            {
                                Debug.LogError("Texture could not be loaded.");
                                return null;
                            }

                            Sprite image =
                                Sprite.Create(
                                tex,
                                new Rect(0.0f, 0.0f, 1.0f, 1.0f),
                                new Vector2(0.5f, 0.5f)
                                );

                            // bild aus dem decoder der map hinzufuegen
                            map.images.Add(image);

                        }

                        return map;
                    }
                }
            }
            catch (Exception)
            {
                return null;
            }
        }
        private void SetMap(Map _map)
        {
            // haben wir bereits eine map
            if(currentMap != null)
            {
                // alle tiles entfernen
                MapGrid.Children.Clear();
                // grid resetten
                MapGrid.RowDefinitions.Clear();
                MapGrid.ColumnDefinitions.Clear();
                // toolbox leeren
                ToolBoxStackPanel.Children.Clear();
            }

            // aktuelle map setzen
            currentMap = _map;
            changed = false;
            DataContext = currentMap;

            // spalten füllen
            for(int i = 0; i < _map.Width; ++i)
            {
                // neue spalte erstellen
                ColumnDefinition def = new ColumnDefinition();

                // groesse der spalte setzten
                def.Width = new GridLength(currentMap.TileWidth, GridUnitType.Pixel);

                // spalte dem grid hinzufuegen
                MapGrid.ColumnDefinitions.Add(def);
            }

            // zeilen füllen
            for (int i = 0; i < _map.Width; ++i)
            {
                // neue zeile erstellen
                RowDefinition def = new RowDefinition();

                // groesse der zeile setzten
                def.Height = new GridLength(currentMap.TileHeight, GridUnitType.Pixel);

                // zeile dem grid hinzufuegen
                MapGrid.RowDefinitions.Add(def);
            }

            // MapGrid.ShowGridLines = true;

            // ueber alle bilder iterieren
            foreach (BitmapFrame image in currentMap.images)
            {
                // bild der toolbox hinzufuegen
                AddToolboxImage(image);
            }

            // tiles erstellen
            for(int s = 0; s < _map.Width; ++s)
            {
                for(int r = 0; r < _map.Height; ++r)
                {
                    UIElement element = null;

                    // pruefen ob map tile enthaelt
                    if (currentMap.Tiles[s, r] != -1)
                    {
                        // erstellen neues image
                        Image newImage = new Image();

                        // das bild soll komplett gefuellt werden
                        newImage.Stretch = Stretch.Fill;

                        // quelle setzen
                        newImage.Source = currentMap.images[currentMap.Tiles[s, r]];

                        element = newImage;
                    }
                    else
                    {
                        // neues image erstellen
                        Rectangle rect = new Rectangle();

                        // fuellfarbe aendern
                        rect.Fill = Brushes.Magenta;

                        element = rect;
                    }

                    // Drop event registrieren
                    element.Drop += Tile_Drop;

                    // das image dem grid an der stelle (s | r) hinzufuegen
                    MapGrid.Children.Add(element);
                    Grid.SetColumn(element, s);
                    Grid.SetRow(element, r);
                }
            }
        }
        private void NewMenuItem_Click(object sender, RoutedEventArgs e)
        {
            if (AbortUnsavedChanges()) { return; }

            CreateMapWindow createWindow = new CreateMapWindow();
            createWindow.ShowDialog();

            // pruefen ob gueltige eingaben gemacht wurden, wenn nicht => stopp
            if (!createWindow.InputValid) { return; }

            // neue map erstellen
            Map newMap = new Map(
                createWindow.MapName,
                createWindow.MapWidth,
                createWindow.MapHeight,
                createWindow.TileWidth,
                createWindow.TileHeight);

            SetMap(newMap);
        }