我正在制作一个WPF应用程序,它将由我们的构建系统标记多个皮肤.理想情况下,我们希望应用程序列出可用的皮肤,因为一些构建将具有一对多皮肤.
在运行时有没有办法枚举特定文件夹中的所有资源字典?
我想避免在我的代码隐藏中对XAML文件名进行硬编码,因为这是一种变化的情况.
出于某种原因,以下代码给了我一个例外.
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/PPCa.Common.Infrastructure;component/Skins/Default.xaml"/>
<ResourceDictionary>
<app:ResourceWrapper x:Key="ResourceWrapper" />
<app:NotOperatorValueConverter x:Key="NotOperatorValueConverter" />
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
Run Code Online (Sandbox Code Playgroud)
这是一个例外:
System.Windows.Markup.XamlParseException occurred
Message=Failed to assign to property 'System.Windows.ResourceDictionary.Source'. [Line: 11 Position: 44]
LineNumber=11
LinePosition=44
StackTrace:
at System.Windows.Application.LoadComponent(Object component, Uri resourceLocator)
InnerException:
Run Code Online (Sandbox Code Playgroud)
第11行是这样的:
<ResourceDictionary Source="/PPCa.Common.Infrastructure;component/Skins/Default.xaml"/>
Run Code Online (Sandbox Code Playgroud)
我错误地合并了我的词典吗?
我的项目中有一个文件夹,模板,完整的(已编译的)XAML ResourceDictionaries.
在UserControl中,我想将所有模板加载到ResourceDictionary中.我会使用如下代码:
public MyView()
{
InitializeComponent();
foreach (var resourceUri in new GetResourceUrisFromTemplatesFolder())
Resources.MergedDictionaries.Add(
new ResourceDictionary
{ Source = new Uri(resourceUri, UriKind.Relative) });
}
Run Code Online (Sandbox Code Playgroud)
我需要写的是GetResourceUrisFromTemplatesFolder方法.我需要它来发现该文件夹中的所有资源.
URI可以采用类似/MyAssembly;component/MyNS/Templates/Template12345.xaml或的形式../../Templates/Template12345.xaml
这可能吗?
我是否必须从程序集的已编译资源(MyAssembly.g.resources)手动转换名称?
我希望能够加载路径的WPF资源字典并将它们逐个输出到文件(jpg,bmp,这没关系).这将在一个类库中,MVC应用程序将访问该类以呈现为http流,因此我只在代码中执行此操作(没有XAML页面).
我已经能够加载字典并遍历路径,但是当我将图像保存到磁盘时,它们是空白的.我知道我遗漏了一些微不足道的东西,比如将路径应用到几何体,或者将其添加到包含矩形的东西中,但我的WPF体验有限.
我正在使用以下代码:
我有一个包含多个路径的WPF资源字典,如下所示:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Path x:Key="Path1" Data="M 100,200 C 100,25 400,350 400,175 H 280" Fill="White" Margin="10,10,10,10" Stretch="Fill"/>
<Path x:Key="Path2" Data="M 10,50 L 200,70" Fill="White" Margin="10,10,10,10" Stretch="Fill"/>
</ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)
以及读取和输出文件的类:
public class XamlRenderer
{
public void RenderToDisk()
{
ResourceDictionary resource = null;
Thread t = new Thread(delegate()
{
var s = new FileStream(@"C:\Temp\myfile.xaml", FileMode.Open);
resource = (ResourceDictionary)XamlReader.Load(s);
s.Close();
foreach (var item in resource)
{
var resourceItem = (DictionaryEntry)item;
var path = (System.Windows.Shapes.Path)resourceItem.Value;
var panel = new StackPanel();
var greenBrush …Run Code Online (Sandbox Code Playgroud) 我目前正在使用MVVMLight框架构建WP7应用程序.我想在我的app.xaml中添加一个资源字典,但是当我这样做时失败了.这是app.xaml的片段
<Application.Resources>
<!--Global View Model Locator-->
<vm:ViewModelLocator x:Key="Locator"
d:IsDataSource="True" />
<!--Merged Resource Dictionaries-->
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="View/StyleResourceDictionary.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
Run Code Online (Sandbox Code Playgroud)
因为我正在使用具有密钥的ViewModelLocator,所以我收到一条错误警告我,无论是否使用密钥,我都无法混合资源.将密钥添加到我的资源字典后它看起来如下所示:
<ResourceDictionary x:Key="resourceDictionary">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="View/StyleResourceDictionary.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)
在资源字典中,我有一个带有"TitleTemplate"键的样式.在任何一种情况下,当我尝试从我的一个视图中引用资源字典时,它都会失败.我的观点中的示例代码如下:
<TextBlock Name="TB_ContactNameLabel"
Text="contact"
Style="{StaticResource TitleTemplate}"/>
Run Code Online (Sandbox Code Playgroud)
设计师立即给我错误"资源'TitleTemplate'无法解析".如果我引用资源字典的键(即:resourceDictionary),则不会抛出任何错误,但它显然没有做任何事情.最后,如果我将resourceDictionary直接添加到其资源中的页面,而不是app.xaml,一切正常.我不想将它添加到我计划使用的每个视图中.我在这里错过了什么吗?
我有一个Windows Phone 7应用程序,我正在尝试创建它的Windows Phone 8版本.
在应用程序中,我在XAML文件中定义了一个ResourceDictionary:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib">
<sys:String x:Key="AppName">My App Name</sys:String>
<!-- etc. -->
</ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)
此AppDaml在App.xaml中引用为:
<!--Application Resources-->
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Assets/Constants.xaml"/>
<!-- etc. -->
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
Run Code Online (Sandbox Code Playgroud)
然后很容易做的事情:
<TextBlock x:Name="ApplicationTitle" Text="{StaticResource AppName}"/>
Run Code Online (Sandbox Code Playgroud)
以上在Windows Phone 7中运行得非常好,但是,在Windows Phone 8中还有一个额外的Application.Resources项目<myNamespace:LocalizedStrings x:Key="LocalizedStrings"/>,当我有我的应用程序时,它不会编译,因为它抱怨
每个字典条目必须具有关联的密钥.
所以我通过代码更改为:
<!--Application Resources-->
<Application.Resources>
<myNamespace:LocalizedStrings x:Key="LocalizedStrings"/>
<ResourceDictionary x:Key="MainDictionary">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Assets/Constants.xaml"/>
<!-- etc. -->
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
Run Code Online (Sandbox Code Playgroud)
现在我有另一个问题.我的应用程序编译,但它运行时抛出一个XamlParseException:
找不到具有Name/Key AppName的资源
这一切都是因为LocalizedStrings资源而发生的.有人可以帮助完成这项工作吗?
顺便说一句,我对Value Converters也有同样的问题; 如果他们以不同的方式完成,我很感激,如果有人可以提供帮助.
提前致谢.
我想使用密钥为Stackpanels创建一个样式.此样式将位于全局ResourceDictionary中,以便在应用程序的任何位置使用.但它不仅应该设置Stackpanel的样式,还应该设置其内容.
我想像这样使用stackpanel:
<StackPanel Style="{StaticResource GlobalStackPanelStyle}">
<Button>test</Button> <-- the button style should also be defined due to the Stackpanel style
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
如果所有包含按钮都应该是绿色的,那么Resourcedictionary应该如何?
在WPF应用程序中,Resources.xaml(资源字典)放在Resources文件夹中,GetStarted.xaml(UserCOntrol)放在Views文件夹中.Wizard.xaml(UserControl)位于根文件夹中.
现在,在Wizard.xaml中:
<ResourceDictionary.MergedDictionaries>
<ResousrceDictionary Source="Resources/Resources.xaml"></ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
Run Code Online (Sandbox Code Playgroud)
工作良好.
我不确定如何访问它在GetStarted.xaml中,
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="component/Resources/Resources.xaml"></ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
Run Code Online (Sandbox Code Playgroud)
不起作用.
请帮我.我是WPF的新手.
球队,
我在Visual Studio 2013中有一个简单的wpf项目.结构如下所示.错误所说的全部内容如标题"查找资源字典时发生错误"所示.我从网上尝试了许多建议并且没有耐心.每件事似乎都没问题.任何有经验的人都可以提出一些建议.提前致谢.

我有一个Windows 10通用应用程序,其中包含一些用于样式的资源字典等.在一个这样的资源字典中,我有一种颜色,MyBlue我想通过后面的代码访问.这是如何实现的?
我已经尝试过this.Resources["MyBlue"],但由于MyBlue是在一个单独的资源字典中定义而不是直接在页面资源中定义,因此它不存在于此集合中.
这是我的app.xaml:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Styles/PodStyles.xaml"/>
<ResourceDictionary Source="Styles/ButtonStyles.xaml"/>
<ResourceDictionary Source="Styles/OfferStyles.xaml"/>
<ResourceDictionary Source="Styles/MyStyles.xaml"/>
<ResourceDictionary>
<!--Global View Model Locator-->
<vm:ViewModelLocator x:Key="Locator"
d:IsDataSource="True"/>
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
Run Code Online (Sandbox Code Playgroud) wpf ×6
xaml ×5
c# ×3
bitmap ×1
dictionary ×1
list ×1
mvvm-light ×1
path ×1
render ×1
resources ×1
search ×1
silverlight ×1
styles ×1
uwp ×1
windows-10 ×1