Успешная ссылка на ResourceDictionary в файле, загружаемом XamlReader.Load()

Я создаю общую сборку WP7, которая будет отображать общую справку/информацию о моих приложениях, каждая сборка приложения будет указывать пару панелей StackPanel, которые содержат некоторую информацию, специфичную для приложения (назовем их 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... пока все безрезультатно .

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


person Brendan Grant    schedule 06.12.2011    source источник
comment
Почему вы используете XamlReader.Load в первую очередь? Если вам нужен повторно используемый элемент управления без XAML, вы должны жестко написать документ на C#.   -  person Claus Jørgensen    schedule 06.12.2011
comment
Здесь такая же проблема. Как ни странно, это работает, если указать полный абсолютный путь, который не может быть решением. Таким образом, XamlReader может разрешать ссылки на дополнительные файлы XAML, но не с относительными путями.   -  person Seven    schedule 13.01.2014


Ответы (1)


Когда я понял, что 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 );
}
person Seven    schedule 13.01.2014