Program bez powodu wywala XamlParseException

0

W jednym programie tworze plik txt i zapisuje go na dysku. Drugi program przy uruchamianiu się odpala metodę ReadFromFile() to co znajdzie w pliku parsuje na xaml i wyświetla w oknie. I dotąd wszystko działa. Napisałem klasę która sprawdza czy plik został zmodyfikowany i wtedy odpala jeszcze raz metodę ReadFromFile() ale tym razem generuje wyjątek XamlParseException. Który co dziwne nie jest przechwytywany przez catch. Kiedy uruchomię program ponownie bez problemu wczytuje zmodyfikowany wcześniej plik, co się tu dzieje? Pierwsze uruchomienie metody działa, a drugie już nie.
Błąd wywala w tej linijce Grid inputGrid = (Grid)XamlReader.Load(xmlReader);
A tu metoda:

private void ReadFromFile()
        {
            try
            {
                Application.Current.Dispatcher.BeginInvoke(
                    DispatcherPriority.Background,
                    new Action(() => this.Grid1.Children.Clear()));
                StringReader stringReader = new StringReader(File.ReadAllText(path));
                XmlReader xmlReader = XmlReader.Create(stringReader);
                Grid inputGrid = (Grid)XamlReader.Load(xmlReader);
                Application.Current.Dispatcher.BeginInvoke(
                    DispatcherPriority.Background,
                    new Action(() => this.Grid1.Children.Add(inputGrid)));
                System.Diagnostics.Debug.WriteLine("udane");
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("nieudane");
                MessageBox.Show(ex.Message);
            }
        }

Dodam jeszcze że błąd jest też wywalany jeśli plik zostanie zedytowany z notatnika.

2

Prawdopodobnie chodzi o kodowanie, sprawdź na Debugu czy metoda ReadAllText nie zwraca krzaków, albo na początku zwracanego napisu nie ma dziwnego znaku białego

0

Nie, ReadAllText w obu przypadkach czyli przy uruchomieniu i przy wywaleniu programu zwraca ten sam normalny tekst.

1

Moim zdaniem gdy tkniesz go notatnikiem na pierwszej pozycji znajduje się byte order mark na podglądzie w Debugu może go nie być widać ale jak w Immediate Window wpiszesz nazwaZmiennej[0] zobaczysz różnicę

0

W Immediate Window zwraca pierwszy znak < taki sam jak w debugu.
Wypisuje że nie odpowiada mu Line 1 Position 7 czyli Name="MainPanel"
Ale kiedy wywalę w ogóle to Name to też wskazuje Line 1 Position 7.

1

Może kodowanie mu się pierdzieli podczas modyfikacji? Jeszcze jako uzupełnienie komentarz masz w pliku xamlowym jakoś wpisane że plik jest kodowany w danym formacie w koncu xaml = xml coś w stylu <?xml version="1.0" encoding="UTF-16"?> z tym zgaduje już całkowicie nigdy nie zapisywałem xamla do pliku. :)

0

Jest, działa!
Zmieniłem File.ReadAllText(path, Encoding.UTF8) i w notatniku też, później zaczęło wywalać jeszcze jakieś błędy z dostępem do GUI z innego wątku, ale z tym sobie poradziłem i gra.
Dzięki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1