Почему установка свойства XAML в RichTextBox на это значение приводит к сбою Silverlight? - PullRequest
2 голосов
/ 03 сентября 2010

Проводя некоторое тестирование конвертера HTML в XAML, над которым я работаю, я столкнулся со странной ситуацией, которую не могу объяснить. Из-за ошибки в моем конвертере HTML в XAML мне дали этот XAML:

<Section xml:space="preserve" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" />

Когда я устанавливаю свойство XAML RichTextBox в эту строку, он игнорирует мои попытки / ловить и завершает работу всего приложения с этой ошибкой:

System.AccessViolationException не обработан Сообщение = Попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена.

Мой код прост:

try {
    rtb.Xaml = ptb.Text;
} catch (Exception ex) {
    MessageBox.Show(ex.Message);
}

Почему это исключение не поймано? Я попытался добавить уловку AccessViolationException, но это ничего не изменило. Спасибо за ваше время.

(Примечание: это Silverlight 4)

Ответы [ 2 ]

1 голос
/ 03 сентября 2010

Не уверен, что это полезно, но вот что я обнаружил:

Свойство Xaml внутри RichTextBox использует XamlReader для анализа Xaml.Это родной код под капотами.Исключение выдается внутри собственного кода, который не всегда является наиболее полезным исключением.

По какой-то причине XamlReader не принимает самозакрывающийся тег Section.

// Gives AccessViolationException.
XamlReader.Load("<Section xml:space=\"preserve\" xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" />");

// Valid...
XamlReader.Load("<Section xml:space=\"preserve\" xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"></Section>");

Чтобы сделать вещи более страннымиПо какой-то причине TextBlock принимает самозакрывающийся тег.

// Valid...
XamlReader.Load("<TextBlock xml:space=\"preserve\" xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" />");

// Valid...
XamlReader.Load("<TextBlock xml:space=\"preserve\" xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"></TextBlock>");

Я не уверен, но, возможно, его, потому что внутри XamlReader часть Section ожидает дочерний узел или что-то подобное, как для TextBlock, он не.

0 голосов
/ 27 сентября 2010

Silverlight, очевидно, требует, чтобы мы делали большинство вещей «асинхронно», и это добавляет множество странностей для отслеживания ошибок.Я подозреваю, что здесь происходит нечто подобное.Предположительно, вызов XamlReader.Load () запускает операцию, которая выполняется асинхронно (хотя, возможно, в том же потоке, через что-то вроде Dispatcher.BeginInvoke ()), и когда эта операция встречает ошибку, она не перехватываетсяс помощью обычного механизма try / catch, потому что выполнение перешло за предложение catch ().

Например, этот код выдаст необработанную ошибку:

try
{
    Deployment.Current.Dispatcher.BeginInvoke(() => throw new Exception("Sucks to be you."));
}
catch(System.Exception ex)
{
     ErrorMessageBox.Show(ex.Message);
}

Я бы поставил хорошие деньги на то, что Dispatcher.BeginInvoke () скрывается где-то в глубинах парсера XAML.

Для чего бы то ни было, нечто подобное происходит с BitmapImage.SetSource ().Смотрите этот вопрос здесь: Изящно обрабатывает исключение загрузки изображения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...