- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在 WPF (.Net 3.5) 中创建一个应用程序,我希望能够根据每个客户端对其进行自定义。我将资源提取到外部 xaml(主题)文件中。将 xaml 文件构建为 Page
,效果非常好。
现在我想使用 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'
我希望能够为每个客户端更改这些资源( Logo 图像等),因此我将构建操作从 Resource
更改为 None
并告诉它始终复制到输出目录。
有没有关于如何在运行时解析 Xaml 并更改我的配置以获取不需要在程序集中编译的图像资源的建议?或者我是否完全偏离了基础并且有更好的方法来实现此主题定制?
这是给出错误的确切行:
<Style x:Key="MainWindow">
<Setter Property="Window.Icon" Value="/Assets/icon.ico" />
</Style>
但那是因为这是加载的第一个 Assets 。这是另一个例子:
<ImageBrush x:Key="NavigationBackgroundImage" ImageSource="Assets/bg.png" TileMode="Tile" Stretch="UniformToFill"/>
这些仅用于通过以下方式访问的样式:
{StaticResource MainWindow}
或
{StaticResource NavigationBackgroundImage}
最佳答案
看来你需要根据这个 blog 创建一个 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);
}
}
}
}
}
希望这对您有所帮助!
关于c# - 带有图像的 XamlReader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11435145/
我知道对于具有指定 clr-namespace: 和 assembly= 标记的控件,XamlReader 只是在指定的程序集中查找该类型。 但是默认命名空间 xmlns="http://schema
在运行时使用DataTemplateSelector创建列。 XamlReader.Load处有异常:System.Windows.StaticResourceExtension。如何加载资源? va
我现在有一个带有德语变音符号(见下文)的 xaml,当我尝试解析它时,我收到了一个无效字符错误。 当我不使用 XamlParser 上下文时,它会起作用。但是我必须使用它来设置一些类型映射 XAML:
我现在有一个带有德语变音符号(见下文)的 xaml,当我尝试解析它时,我收到了一个无效字符错误。 当我不使用 XamlParser 上下文时,它会起作用。但是我必须使用它来设置一些类型映射 XAML:
我正在 WPF (.Net 3.5) 中创建一个应用程序,我希望能够根据每个客户端对其进行自定义。我将资源提取到外部 xaml(主题)文件中。将 xaml 文件构建为 Page,效果非常好。 现在我想
我正在尝试加载 foillowing xaml: 在我
我正在尝试加载 foillowing xaml: 在我
在我们的应用中,无论对象的类型如何,我们都需要将对象的属性以propertyName、propertyValue、propertyType的形式保存到同一个数据库表中。我们决定使用 XamlWrite
我有一些 Xaml 对象的字符串表示形式,我想构建控件。我正在使用 XamlReader.Parse功能来做到这一点。对于一个简单的控件,例如 Button,它有一个不带任何参数的默认构造函数,这工作
我正在尝试从 xaml 生成我自己的自定义磁贴。我已将一些代码从 C++ 转换为 C#,以便将其集成到我的应用程序中。 基本上我有这个方法: async Task GenerateHighResTil
我在 (UIElement)XamlReader.Load(...) 期间得到一个异常 'Cannot create unknown type 'TextBox'.' Line number '1'
F# 不支持部分类,也不支持 XAML 文件的预编译。解决方法:在运行时加载图形对象定义,而不是后面的编译时代码。有多种方法可以为 XamlReader 提供引用资源文件的内容。 open Syste
XamlReader正在使用本地程序集和 WPF 程序集中定义的类型加载 Xaml,没有任何问题。 如果我包含在外部程序集中定义的类型,那么 XamlParseException抛出以下消息。 Can
我正在尝试在我的 WPF 项目中实现下面的代码,以便为具有动态列的 DataGrid 动态生成 DataTemplates。我在 StackOverflow here 上找到了代码 public Da
我正在使用 XamlReader.Parse(string) 动态构建我的数据模板。我遇到的问题是我无法将任何事件放在我使用 XamlReader 创建的任何控件上。在网上做了一些研究后,我了解到这是
与 earlier question 有关我问过,我看到有 LoadComponent() 和 XamlReader.Load()。它们非常相似,以至于我不太确定在什么情况下应该使用哪一个。 那么,从
我有一个程序,用户可以在其中查看保存在 XAML 中的各种 3D 模型,然后使用 TrackballDecorator 操作 Viewport3D。这些 XAML 文件中包含转换,我使用问题 WPF
WPF 应用程序具有使用 XamlReader.Load() 方法从单独的文件加载用户控件的操作: StreamReader mysr = new StreamReader(pathToFile);
我正在玩 .net 4 System.Windows.Markup.XamlReader - 就像一个教育练习 - 我一直遇到同样的问题:用 XamlReader.Load 加载 xaml抛出一个 X
我正在构建一个通用 WP7 程序集,它将显示我的应用程序的通用帮助/关于信息,每个应用程序程序集将指定一对 StackPanels,其中包含一些应用程序特定信息(称为 em Legal.xaml 和
我是一名优秀的程序员,十分优秀!