Связанный контент не работает для ресурса Dictionary - PullRequest
3 голосов
/ 19 января 2011

Итак, в нашем документе Styles.xaml мы используем внешний XML для предоставления цветов для стилей. Мы думали, что это обеспечит хороший уровень абстракций, чтобы люди, которые не были программистами, могли изменить внешний вид нашего приложения.

Работает что-то такое:

<ResourceDictionary
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:CalManv4UI"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"
    xmlns:toolkit="http://schemas.microsoft.com/wpf/2008/toolkit"
 mc:Ignorable="d"
 >

  <XmlDataProvider x:Key="BrandInfo" Source="/Config/BrandInfo.xml" XPath="BrandRoot" />

    <Style TargetType="{x:Type TextBox}">
  <Setter Property="Foreground" Value="{Binding Source={StaticResource BrandInfo}, XPath=//Colors/@TextBoxForeground}"/>
        <Setter Property="Background" Value="{Binding Source={StaticResource BrandInfo}, XPath=//Colors/@TextBoxBackground}"/>
  <Setter Property="FontSize" Value="11"/>
  <Setter Property="FontFamily" Value="Verdana"/>
 </Style>
</ResourceDictionary>

И это работает, и все хорошо, но нам нужно было добавить пару вспомогательных приложений, которые бы повторно использовали стиль основного приложения.

Итак, я ссылался на основное приложение, чтобы получить доступ ко всему коду goo, а затем также использовать стили. Но когда я делаю это, я получаю IOException «Не удается найти ресурс« config / brandinfo.xml ».». Я дважды проверил, что brandinfo.xml копируется, так как mainApp был обновлен, поэтому я был озадачен.

Следующее, что я решил попробовать - использовать его в качестве связанного файла, поэтому я создал папку конфигурации и добавил ее в качестве ссылки, всегда устанавливая ее для копирования содержимого. Который создает этот код в моем файле csproj

<ItemGroup>
 <Content Include="..\MainAppUI\Config\BrandInfo.xml">
  <Link>Config\BrandInfo.xml</Link>
  <CopyToOutputDirectory>Always</CopyToOutputDirectory>
 </Content>
</ItemGroup>

Все еще не работает, поэтому я добавил его в файл. Который создает этот код в моем файле csproj.

<ItemGroup>
 <Content Include="Config\BrandInfo.xml">
  <CopyToOutputDirectory>Always</CopyToOutputDirectory>
 </Content>
</ItemGroup>

Так что это работает, но теперь у меня есть две копии моего файла BrandInfo, что может стать проблемой для дальнейшего обслуживания.

Ответы [ 2 ]

3 голосов
/ 27 июля 2011

У меня была такая же проблема.К счастью, этот имел подсказку - связанный файл находится в корне.

Итак, допустим, у меня есть следующая структура: MyAssembly -> MyFolder -> MyDictionary.xaml

Для загрузки формы словаря App.xaml выполните:

  1. , если MyDictionary.xaml является "настоящим" файлом -

    <ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
    <ReosurceDictionary Source="pack://application:,,,/MyAssembly;component/MyFolder/MyDictionary.xaml" />
    </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
    
  2. если MyDictionary.xaml является связанным файлом -

    <ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
    <ReosurceDictionary Source="pack://application:,,,/MyAssembly;component/MyDictionary.xaml" />
    </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
    

(ПРИМЕЧАНИЕ. MyFolder опущен)

Предупреждение. Я проверял код на неподключенном компьютерев Интернет, и фрагменты написаны в Notepad ++, поэтому орфография или синтаксис могут быть отключены.

1 голос
/ 05 апреля 2013

Я пытаюсь найти обходной путь для этой проблемы.Какая у нас проблема?Проблема в том, что в режиме проектирования Uri

"/UBP.Documents.RWS;component/Resources/ThirdPartyDocumentResourceDictionary.xaml"

является правильным

, но во время выполнения мы должны заменить его на

"/UBP.Documents.RWS;component/ThirdPartyDocumentResourceDictionary.xaml"

Возможно ли сделать это автоматически?И вот о чем я думаю: я хочу сделать класс MyResourceDictionary унаследованным от стандартного ResourceDictionary и сделать подстановки в зависимости от того, находимся ли мы в DesignTime или нет.

Примерный код выглядит следующим образом:

 public class MyResourceDictionary : ResourceDictionary
    {

        new public Uri Source
        {
            get 
            {
                return base.Source;                
            }
            set
            {
                if (DesignerProperties.GetIsInDesignMode(new DependencyObject()))
                {
                    base.Source = value;
                }
                else
                {
                    string originalString = value.OriginalString;
                    string newString = originalString.Substring(0, originalString.IndexOf(";component") + 11) + originalString.Substring(originalString.LastIndexOf("/") + 1);                    
                    base.Source = new Uri(newString, UriKind.Relative);
                    base.Source = value;
                }                
            }
        }       
    }

Xaml выглядит как

  <ResourceDictionary.MergedDictionaries>
                <localconverters:MyResourceDictionary Source="/UBP.Documents.RWS;component/Resources/ThirdPartyDocumentResourceDictionary.xaml" />
            </ResourceDictionary.MergedDictionaries>

, и во время выполнения это работает, но не в режиме разработки (((Следующее, что я отключил в режиме отладки дизайна, что в сеттере в строке

base.Source = value;

происходит исключение, оно говорит: "Префикс URI не распознан".

Мне интересно, что находится в моем "значении":

"markup://1/file:///D:/Svn/2.08.0016_20121116/Development/Sources/Universal/UBP.Documents.RWS/Presentation/ProbateCaseView.xaml%230//UBP.Documents.RWS;component/Resources/ThirdPartyDocumentResourceDictionary.xaml}".

Это не то, что я долженсм. (может быть из-за моих элементарных знаний о классе Uri).

Я вижу, кроме моего пути к словарю ресурсов ("/UBP.Documents.RWS;component/Resources/ThirdPartyDocumentResourceDictionary.xaml") естьпрефикс с путем к файлу XAML моего приложения, где написана эта строка. Может ли кто-нибудь объяснить мне, как преобразовать этот Uri в мой относительный Uri, основываясь на строке

"/UBP.Documents.RWS;component/Resources/ThirdPartyDocumentResourceDictionary.xaml"

Или, может быть, вы могли бы обидетьболее элегантное решение?

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