gpt4 book ai didi

c# - 带有图像的 XamlReader

转载 作者:行者123 更新时间:2023-11-30 12:13:35 30 4
gpt4 key购买 nike

我正在 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com