2009-02-23 5 views
10

У меня есть приложение Windows Forms, которое должно содержать элемент управления WPF во время выполнения. У меня есть базовый хостинг и взаимодействие (с помощью элемента управления ElementHost), и все работает нормально, пока я не попытаюсь сделать что-то, что требует, чтобы элемент управления WPF использовал определенные пользовательские словари ресурсов, которые определены. (Управление WPF и все эти словари ресурсов все определены в том же WPF Control Library DLL.)Загрузка/использование ресурсных словарей из WinForms размещенного элемента управления WPF

Как только это произойдет, я получаю кучу ошибок, которые выглядят так:

System.Windows.ResourceDictionary Warning: 9 : Resource not found; ResourceKey='DocumentHeaderInterestStyle' 

Я нашел один reference (ссылка кажется мертвой из-за архивирования, thisможет быть той же статьей, на которую первоначально ссылались). что об этом говорит, но похоже, что статья приближается к вещам больше со стороны WPF, но я действительно не хочу вносить изменения в элемент управления WPF, поскольку все работает в автономном приложении WPF.

Если единственный способ добиться этого - внести изменения на стороне WPF, я могу получить эти изменения (я не несу ответственность за библиотеку управления WPF, но человек, который также работает для одной и той же компании, не проблема, кроме того, что ему нужно время для внесения изменений.), но я надеюсь на то, что я могу сделать на стороне WinForms, чтобы заставить это работать.

Библиотека управления WPF имеет словаря ресурсов файл с именем «Default.xaml» определены в проекте со следующими свойствами:

Сложение Действие: Page Копировать в выходной каталог: Не копировать Выборочная инструмент: MSBuild Компиляция

автономная WPF приложение имеет следующую запись в этом App.xaml файл:

<ResourceDictionary x:Uid="ResourceDictionary_1"> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary x:Uid="ResourceDictionary_2" Source="/SmartClient.Infrastructure;component/Themes\Default.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 

Похожа библиотекой управления уже должно знать, как т o получить свои ресурсы. Использование Resource.MergedDictionaries.Add() похоже, что оно должно работать, но где я могу получить экземпляр существующего словаря?

ответ

4

Предполагая, что вы знаете, какие ресурсы вам нужны (звучит так, как будто вы), вы должны просто «сами» их вводить. Что-то вроде:

var wpfControl = new ...; 
wpfControl.Resources.Add(...); 
elementHost.Child = wpfControl; 

В своем вопросе вы упомянули, что в библиотеке управления есть существующие ресурсные словари. Если да, то вы можете просто сделать это:

var wpfControl = new ...; 
wpfControl.Resources.MergedDictionaries.Add(/* instance of existing dictionary */); 
elementHost.Child = wpfControl; 
+2

Где бы «ключ» и «значение» приходят из за вызов? Добавить –

+0

Это имеет смысл, но разве словари уже не слиты? Я обновил свой вопрос с дополнительной информацией о том, как выглядит сторона WPF. –

+0

Вы потрясены, это сработало волшебно. Вы действительно спасли мое время. –

1

Для загрузки словарей ресурсов, которые встроены в сборку, я использовал следующий фрагмент кода для загрузки их во время выполнения:

//using System.Windows 
ResourceDictionary dict = new ResourceDictionary(); 
dict.Source = new Uri("MyResourceDictionary.xaml", UriKind.Relative); 

Application.Current.Resources.MergedDictionaries.Add(dict); 

Это будет также работают для загрузки словаря в исполняемый каталог.

0

Предположим, что у вас есть свои стили/шаблоны/ресурсы, разделенные на множество файлов Resources1.xaml и Resources2.xaml, вы можете объединить их в один ресурсный словарь (AllResources.xaml). Словарь ресурсов можно легко добавить в элемент управления в файле xaml элемента управления. См. Пример ниже.

(!) Set Resources1.xaml, Resources2.xaml и AllResources.xaml строить действия по Page

Resources1.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

    <ControlTemplate x:Key="ScrollViewerControlTemplate" TargetType="{x:Type ScrollViewer}"> 
     ... 
    </ControlTemplate> 

    <LinearGradientBrush x:Key="VerticalScrollBarBackground" EndPoint="1,0" StartPoint="0,0"> 
     ... 
    </LinearGradientBrush> 

    <Style x:Key="StyleA" TargetType="{x:Type ScrollBar}"> 
     ... 
    </Style> 

</ResourceDictionary> 

Resources2.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 


    <Style x:Key="StyleB" TargetType="{x:Type ScrollBar}"> 
     ... 
    </Style> 

    <Style x:Key="StyleC" TargetType="{x:Type TextBlock}"> 
     ... 
    </Style> 

</ResourceDictionary> 

AllResources.xaml

Добавление источников словарей ресурсов, как относительные путик AllResources.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> 
    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="Resources1.xaml" /> 
     <ResourceDictionary Source="Resources2.xaml" /> 
    </ResourceDictionary.MergedDictionaries> 
</ResourceDictionary> 

Наконец в вашем UserControl

<UserControl.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="pack://application:,,,/projectName;component/PathToTheFileRelativeToProjectRootDirectory/AllResources.xaml 
     <converters:StringToUpperCaseConverter x:Key="StringToUpperCaseConverter" /> 
     <converters:LocalizationEntryToStringCaseConverter x:Key="LocalizationEntryToStringCaseConverter" /> 
    </ResourceDictionary> 
</UserControl.Resources> 
Смежные вопросы