Получение XamlParseException при вызове XamlReader.Load (xmlReader) - PullRequest
1 голос
/ 04 февраля 2012

Я получаю XamlParseException при вызове XamlReader.Load () в button1_Click (отправитель объекта, RoutedEventArgs e) с кодом ниже:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
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;
using System.Data.SqlClient;
using System.Data;
using System.IO;
using HTMLConverter;
using System.Windows.Markup;


namespace StackoverflowTest
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public static SqlConnection conn = new SqlConnection("Server=" + @".\SQLEXPRE" +
                                    ";Initial Catalog=Hukuk;" +
                                    "Integrated Security=True;" +
                                    "User ID=;" +
                                    "Password=;");

        public MainWindow()
        {
            InitializeComponent();
            try
            {
                conn.Open();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error opening SQL Server connection\n" + ex.Message);
                //Close();
            }

        }

        public static FlowDocument SetRTF(string xamlString)
        {
            StringReader stringReader = new StringReader(xamlString);
            System.Xml.XmlReader xmlReader = System.Xml.XmlReader.Create(stringReader);
            return XamlReader.Load(xmlReader) as FlowDocument;
        }


        private void button1_Click(object sender, RoutedEventArgs e)
        {
            SqlCommand commProc = new SqlCommand("SELECT Name, Content from Document where ID=3219", MainWindow.conn);
            string str;
            FlowDocumentReader fdocr = new FlowDocumentReader();
            SqlDataReader dr = commProc.ExecuteReader();
            try
            {
                if (dr.Read())
                {
                    byte[] bt = (byte[])dr["Content"];
                    str = Encoding.Default.GetString(bt);
                    str = HTMLConverter.HtmlToXamlConverter.ConvertHtmlToXaml(str, true);
                    fdocr.Document = MainWindow.SetRTF(str);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("An error occured while trying to view document\n" + ex.Message);
            }

            dr.Close();
            dr.Dispose();
        }
    }
}

К сожалению, я не могу опубликовать строку xamlstring, которую я пытаюсь передать, потому чтослишком велик .. Есть ли другой способ показать это вам?

И подробности исключения здесь:

System.Windows.Markup.XamlParseException occurred
  Message='Add value to collection of type 'System.Windows.Documents.TableRowGroupCollection' threw an exception.' Line number '1' and line position '28143'.
  Source=PresentationFramework
  LineNumber=1
  LinePosition=28143
  StackTrace:
       at System.Windows.Markup.XamlReader.RewrapException(Exception e, IXamlLineInfo lineInfo, Uri baseUri)
       at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
       at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, Boolean skipJournaledProperties, Uri baseUri)
       at System.Windows.Markup.XamlReader.Load(XamlReader xamlReader, ParserContext parserContext)
       at System.Windows.Markup.XamlReader.Load(XmlReader reader, ParserContext parserContext, XamlParseMode parseMode)
       at System.Windows.Markup.XamlReader.Load(XmlReader reader)
       at WpfApplication1.MainWindow.SetRTF(String xamlString) in C:\Documents and Settings\nosirovkh\Рабочий стол\посл\WpfApplication1\WpfApplication1\WpfApplication1\MainWindow.xaml.cs:line 69
  InnerException: System.ArgumentNullException
       Message=Value cannot be null.
Parameter name: item
       Source=PresentationFramework
       ParamName=item
       StackTrace:
            at MS.Internal.Documents.TableTextElementCollectionInternal`2.Add(TElementType item)
            at MS.Internal.Documents.ContentElementCollection`2.System.Collections.IList.Add(Object value)
            at System.Windows.Documents.TableRowGroupCollection.System.Collections.IList.Add(Object value)
            at System.Xaml.Schema.XamlTypeInvoker.AddToCollection(Object instance, Object item)
            at MS.Internal.Xaml.Runtime.ClrObjectRuntime.Add(Object collection, XamlType collectionType, Object value, XamlType valueXamlType)
       InnerException: 

Ответы [ 2 ]

2 голосов
/ 07 февраля 2012

Похоже, ваш XAML, вероятно, сгенерирован какой-то программой, которая является источником проблемы.

Вот проблема:

<Table>
  <TableColumn Width="331"/>
  <TableColumn Width="48"/>
  <TableColumn Width="48"/>
  <TableColumn Width="48"/>
  <TableColumn Width="48"/>
  <TableColumn Width="44"/>
  <TableColumn Width="52"/>
  ...
</Table>

А вот правильный код:

<Table>
  <Table.Columns>
    <TableColumn Width="331"/>
    <TableColumn Width="48"/>
    <TableColumn Width="48"/>
    <TableColumn Width="48"/>
    <TableColumn Width="48"/>
    <TableColumn Width="44"/>
    <TableColumn Width="52"/>
  </Table.Columns>
  ...
</Table>

Есть 6 таблиц, где это происходит.

Я не знаю, что сгенерировало этот XAML, но это похоже на ошибку. Вам нужно будет либо исправить его, либо исправить файл XAML самостоятельно, либо написав небольшую программу для поиска такого рода вещей, либо вручную с (предпочтительно) Visual Studio.

0 голосов
/ 12 апреля 2013

У меня была похожая ошибка при запуске приложения WPF со следующим кодом xaml:

<Window x:Class="XXX.Wpf.IV.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="IV" WindowState="Normal" Height="1024" Width="1280">

<Grid>
    <local:IVView x:Name="_ivView"/> 
</Grid>

</Window>

Оказывается, причина, по которой "XmalParseException add to collection ..." заключалась в том, что мой класс IVView долженБыл UserControl, но я создал его как расширение Window.Я подозреваю, что у нас есть похожие проблемы.

...