Создание WPF ResourceDictionary из кода, кажется, не работает при установке ResourceDictionary.Source - PullRequest
1 голос
/ 29 октября 2010

У меня есть проект, содержащий xaml ResourceDictionary, который я хочу использовать вне FrameworkElement. Словарь ресурсов будет содержать DataTemplate для класса, локального для проекта, чтобы избежать загрязнения app.xaml (так как проект является модулем призмы и не всегда будет присутствовать в зависимости от конфигурации).

Итак, у меня есть файл test.xaml с действием сборки Resource.

Это предназначено для предоставления DataTemplate для класса TestObject.

В классе TestObject у меня есть метод GetTemplate ()

Следующие работы:

DataTemplate GetTemplate()
{
    Uri uri = new Uri("MyProject;component/test.xaml", UriKind.Relative);

    var dict = new ResourceDictionary { Source = uri};

    return (DataTemplate)dict["TestObjectDataTemplate"];
}

Это вызывает исключение, когда я присваиваю uri свойству ResourceDictionary.Source

DataTemplate GetTemplate()
{
    Uri uri = new Uri("/test.xaml", UriKind.Relative);

    var dict = new ResourceDictionary { Source = uri};

    return (DataTemplate)dict["TestObjectDataTemplate"];
}

Второй пример завершается ошибкой, так как /test.xaml не может быть найден в локальной сборке. Зачем мне нужен доступ к нему с помощью "ReferencedAssembly; component / test.xaml"?

В данном случае означает ли локальная сборка исполняющуюся сборку или сборку, частью которой является код / ​​ресурс?

Редактировать: Обновлено, чтобы отразить фактическую проблему.

Ответы [ 2 ]

2 голосов
/ 29 октября 2010

Попробуйте UriKind.RelativeOrAbsolute.

Более четко как.

    DataTemplate GetTemplate()
    {           
        ResourceDictionary resource = new ResourceDictionary()
        {
            Source = new Uri(@"/AssemblyFullName;component/test.xaml", UriKind.RelativeOrAbsolute)
        };

        return (DataTemplate)resource["TestObjectDataTemplate"];
    }

Редактировать:

В этом случае локальныйсборка означает, что выполняется сборка или сборка, частью которой является код / ​​ресурс?

Скажите, например:У вас есть два проекта Проект А и Проект Б.

Вы используете проект A в качестве ссылки в проекте B

Теперь, если вы хотите использовать ресурс, подобный этому /test.xaml.Затем этот ресурс должен находиться в проекте B. Так как это исполняющая сборка.[Это будет доступно как для проекта A, так и для проекта B. Вы можете использовать вышеупомянутый синтаксис.например, /test.xaml]

Если вы хотите, чтобы ресурс был определен и использован в Project A. Затем вы должны использовать "/ProjectA;component/test.xaml", потому что это не текущая исполняемая сборка.[Это будет доступно как для проекта A, так и для проекта B. Вы должны использовать "/ProjectA;component/test.xaml" для доступа к обоим проектам]

1 голос
/ 29 октября 2010

Настройка Source attr работает, я успешно использовал его во многих проектах.
Ваш Uri может быть не прав. Вы должны попробовать полностью квалифицированный пакет Uri, например:

dict.Source = new Uri("pack://application:,,,/test.xaml");

Если ваш test.xaml файл не находится в корне проекта, убедитесь, что правильно указали его путь.

...