因此,在我们的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文件,这可能是未来事宜的问题。
答案 0 :(得分:3)
我遇到了同样的问题。幸运的是,this有一个线索 - 链接文件在根目录中。
所以,假设我有以下结构: MyAssembly - &gt; MyFolder - &gt; MyDictionary.xaml
要加载字典表单App.xaml do:
如果MyDictionary.xaml是“真实”文件 -
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ReosurceDictionary Source="pack://application:,,,/MyAssembly;component/MyFolder/MyDictionary.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
如果MyDictionary.xaml是链接文件 -
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ReosurceDictionary Source="pack://application:,,,/MyAssembly;component/MyDictionary.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
(注意:MyFolder被忽略)
警告:我在未连接到互联网的计算机上测试了代码,并且这些代码段是用Notepad ++编写的,因此拼写或语法可能会关闭。
答案 1 :(得分:1)
我正试图找到这个问题的解决方法。我们遇到了什么问题?问题是在设计模式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文件的路径,其中写了第i行。 任何人都可以解释我如何将这个Uri转换为我的相对Uri,基于字符串
"/UBP.Documents.RWS;component/Resources/ThirdPartyDocumentResourceDictionary.xaml"
或者你可以提供更优雅的解决方案吗?