2010-09-24 2 views
1

У меня есть строковое представление XAML сетки так:Создание сетки из строки с помощью XamlReader

<Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> 
    <Canvas Background="Yellow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> 
     <Label Content="textik" /> 
    </Canvas> 
</Grid> 

Что мне нужно сделать, это создать объект сетки из этой строки. Я пробовал много подходов, но до сих пор ближе всего находится код ниже:

string content = "<Grid xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"><Canvas Background=\"Yellow\" xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"><Label Content=\"textik\" /></Canvas></Grid>"; 

// the string is created programatically, I just put it here to see what it looks like at the end of the process 

Stream stream = new MemoryStream(System.Text.ASCIIEncoding.ASCII.GetBytes(content)); 

object objGrid = XamlReader.Load(stream); 
Grid myGrid = (Grid) objGrid; 

Однако XamlParsedException происходит о том, что корневой элемент отсутствует.

Есть ли у меня ошибка в коде XAML, который я просто не вижу? Или плохой подход?

Спасибо за ответ

ответ

2

Какую версию рамки вы используете? В 4 у вас есть дополнительные классы в System.Xaml, которые более гибкие. Вы можете использовать System.Xaml.XamlServices.Load(stream);, чтобы получить точный объект Grid в свободном xaml. Однако, используя как 4, так и 3.5 в VS2010, ваш точный код (во втором фрагменте) возвращает ожидаемый результат. Не уверен, что проблема на вашей стороне, но это может быть не код, который вы опубликовали.

+0

Оказалось, что проблема была не в коде, который я опубликовал. Из более ранних разрешений я читал поток, чтобы увидеть, что внутри, и метод ReadToEnd() переместил начало потока в конец, поэтому XamlReader.Read() не получил полный контент ... – Gal

+0

string content = " <Сетка .... "; Поток потока = новый MemoryStream (System.Text.ASCIIEncoding.ASCII.GetBytes (контент)); Считыватель StreamReader = новый StreamReader (поток); string whatsInside = reader.ReadToEnd(); объект objGrid = XamlReader.Load (поток); Grid myGrid = (Grid) objGrid; – Gal

0

Попробуйте также добавление xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" к корневым сетевому элементу. Также вам не нужно xmlns снова в Canvas (но это тоже не повредит - за исключением того, что ваши строки становятся излишне большими).

+0

Второй xmlns (в холсте) создается через XamlReader.Read(). Вы видите, что я делаю, я загружаю файл xaml, играю в некоторые игры с кодом, а затем пытаюсь создать сетку из результирующей строки. Это просто побочный эффект. – Gal