链接的内容不适用于资源字典

时间:2011-01-18 23:18:21

标签: wpf visual-studio-2010 xaml

因此,在我们的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是否被复制,因为我对此感到困惑。

我认为我接下来会尝试将其用作链接文件,因此我创建了一个配置文件夹并添加为链接,始终将其设置为内容副本。这在我的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 个答案:

答案 0 :(得分:3)

我遇到了同样的问题。幸运的是,this有一个线索 - 链接文件在根目录中。

所以,假设我有以下结构: MyAssembly - &gt; MyFolder - &gt; MyDictionary.xaml

要加载字典表单App.xaml do:

  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>
    
  3. (注意:MyFolder被忽略)

    警告:我在未连接到互联网的计算机上测试了代码,并且这些代码段是用Notepad ++编写的,因此拼写或语法可能会关闭。

答案 1 :(得分:1)

我正试图找到这个问题的解决方法。我们遇到了什么问题?问题是在设计模式Uri

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

是正确的

但在运行时我们必须将其替换为

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

是否可以自动执行此操作?这就是我在想: 我想让MyResourceDictionary类继承自标准的Res​​ourceDictionary,并根据我们是否在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文件的路径,其中写了第i行。 任何人都可以解释我如何将这个Uri转换为我的相对Uri,基于字符串

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

或者你可以提供更优雅的解决方案吗?