Успешная ссылка на ResourceDictionary в файле, загружаемом XamlReader.Load () - PullRequest
3 голосов
/ 06 декабря 2011

Я создаю общую сборку WP7, которая будет отображать общую справку / информацию о моих приложениях, каждая сборка приложения будет указывать пару StackPanels, которые содержат некоторую информацию, относящуюся к приложению (хорошо называйте их Legal.xaml и WhatsNew.xaml).

В идеале эти специфичные для приложения файлы XAML должны быть в виде открытого текста (вместо чего-то, что создается в коде), чтобы их можно было загружать через HTTP или как строку встроенного ресурса.

Загрузка XAML работаетхорошо, пока я не попытаюсь разбить некоторые определения стилей на другой файл, XamlReader.Load () завершится неудачно с примечанием: «Значение атрибута AboutPageDocs / CommonStyles.xaml находится вне диапазона.[Строка: 43 Позиция: 45] ”

Эта ошибка может произойти при загрузке Legal.xaml, которая, когда мы смотрим вокруг, как 43, мы находим, где я пытаюсь загрузить ResourceDictionary, который теперь содержит пользовательские стили:

<StackPanel.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="AboutPageDocs/CommonStyles.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</StackPanel.Resources>

Вот ошибка ... если просто скопировать и вставить код StackPanel (который загружается динамически во время выполнения) и поместить его в UserControl ... все работает отлично.

Если не считать определения встроенных стилей в Legal.xaml и WhatsNew.xaml ... есть ли способ получить свойство XamlReader.Load () для поиска CommonStyles.xaml?

При мысли, что источникпуть был неправильным, я пытался разместить копии CommonStyles.xaml в разных местах в обеих сборках ... а также экспериментировал с синтаксисом pack: // uri ... пока безрезультатно.

Чего мне не хватает?

1 Ответ

1 голос
/ 14 января 2014

Поскольку я понял, что XamlReader может разрешать ссылочные файлы XAML, когда они указаны как абсолютные пути, я искал возможность указать собственный контекст.

Мне показалось, что это работает, когда я указываю ParserContext при вызове XamlReader.Load ()

public static FlowDocument ReadFlowDocument( FileInfo xamlFile )
{
    // Specify a ParserContext.
    // It's important to set BaseUri to the file itself
    // not to its parent direcory!
    ParserContext parserContext = new ParserContext();
    parserContext.BaseUri = new Uri( xamlFile.ToString() );

    // Create a stream from this file
    FileStream stream = new FileStream( xamlFile.ToString(), FileMode.Open );

    // Let the XamlReader load and parse the XAML. It will resolve any referenced ResourceDirectories
    // specified with a relative path
    return (FlowDocument) XamlReader.Load( stream, parserContext );
}
...