我正在WPF中创建一个应用程序(.Net 3.5),我希望能够在每个客户端基础上进行定制。我将资源抽象为外部xaml (主题)文件。对于构建为Page的xaml文件,这是完美的工作方式。
现在,我想使用XamlReader动态加载主题的xaml文件。通过这种方式,我可以编译应用程序,其他人也可以自定义应用程序(每个客户端),而无需重新编译或访问源代码。下面是我正在做的事情的快照:
Directory.GetFiles(pathToThemeDirectory).Each((file) =>
{
using (Stream stream = new FileStream(file, FileMode.Open))
{
var dir = Directory.GetCurrentDirectory();
var dict = XamlReader.Load(stream) as ResourceDictionary;
Application.Current.Resources.MergedDictionaries.Add(dict);
}
});现在,这似乎正确地解析了Xaml。但是,我现在收到一个错误,如下所示:
Cannot convert string '/Path/To/Image/File.ico' in attribute 'Icon' to object of
type 'System.Windows.Media.ImageSource'. Cannot locate resource
'/Path/To/Image/File.ico'. Error at object 'System.Windows.Setter'我希望能够为每个客户端更改这些资源(徽标、图像等),因此我已经将构建操作从Resource更改为None,并告诉它始终复制到输出目录。
对于如何在运行时解析Xaml并更改配置以获得不需要在程序集中编译的映像资源,有什么建议吗?还是我完全偏离了基础,有更好的方法来实现这个主题定制?
更新:
下面是给出错误的确切行:
<Style x:Key="MainWindow">
<Setter Property="Window.Icon" Value="/Assets/icon.ico" />
</Style>但这是因为这是第一批资产。下面是另一个例子:
<ImageBrush x:Key="NavigationBackgroundImage" ImageSource="Assets/bg.png" TileMode="Tile" Stretch="UniformToFill"/>这些仅用于通过以下方式访问的样式:
{StaticResource MainWindow}或
{StaticResource NavigationBackgroundImage}发布于 2012-07-11 16:58:39
您似乎需要根据这个ParserContext创建一个博客。
在这个例子中,他做的是:
var resourceDictionary = XamlReader.Load(fileStream) as ResourceDictionary;
if(resourceDictionary != null)
{
Resources.MergedDictionaries.Add(resourceDictionary)
}但是之后,代码被更改为:
var applicationDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
if(!String.IsNullOrEmpty(applicationDirectory ))
{
var runtimeResourcesDirectory = Path.Combine(applicationDirectory , "RuntimeResources");
var pc = new ParserContext
{
BaseUri = new Uri(runtimeResourcesDirectory , UriKind.Absolute)
};
if(Directory.Exists(runtimeResourcesDirectory ))
{
foreach (string resourceDictionaryFile in Directory.GetFiles(runtimeResourcesDirectory , "*.xaml"))
{
using (Stream s = File.Open(resourceDictionaryFile, FileMode.Open, FileAccess.Read))
{
try
{
var resourceDictionary = XamlReader.Load(s, pc) as ResourceDictionary;
if (resourceDictionary != null)
{
Resources.MergedDictionaries.Add(resourceDictionary);
}
}
catch
{
MessageBox.Show("Invalid xaml: " + resourceDictionaryFile);
}
}
}
}
}希望这能有所帮助!
https://stackoverflow.com/questions/11435145
复制相似问题