我正在尝试使用该语句动态添加xaml资源文件,
Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("resources/leaf_styles.xaml", UriKind.Relative) });
Run Code Online (Sandbox Code Playgroud)
这是抛出异常,无法找到资源'resources/leaf_styles.xaml'.
我将leaf_styles.xaml文件添加到资源文件夹下的项目中,BuildAction设置为"Content",CopyAlways设置为True.我仍然得到这个错误.有人可以帮我指出什么错?
附加信息 -
如果我把它作为绝对位置,它正常工作.
Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri(@"D:\foo\trunk\bin\resources\leaf_styles.xaml", UriKind.Absolute) });
Run Code Online (Sandbox Code Playgroud) 我有一个Styles.xaml该集团很多ResourceDictionary的内线一个MergedDictionary.
我导入了Styles.xaml UserControl.Resources
<UserControl.Resources>
<ResourceDictionary Source="Dictionaries\Styles.xaml" />
</UserControl.Resources>
Run Code Online (Sandbox Code Playgroud)
但是当我尝试添加转换器时
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Dictionaries\Styles.xaml" /> <--! Exception -->
</ResourceDictionary.MergedDictionaries>
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
</ResourceDictionary>
</UserControl.Resources>
Run Code Online (Sandbox Code Playgroud)
它提升了
ArgumentNullException:值不能为null.
参数名称:item
将转换器包装在另一个内部MergedDictionary无效.
我怎么解决这个问题?
谢谢你们!
我最终弄清楚了:它Exception是在.xaml文件中引发的,但是Visual Studio没有提供足够的信息来找到错误的行.
以下代码确实有效.
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Dictionaries\Styles.xaml" />
</ResourceDictionary.MergedDictionaries>
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
</ResourceDictionary>
</UserControl.Resources>
Run Code Online (Sandbox Code Playgroud) 我已经开始将各种常见的Images 移动到一个ResourceDictionary并注意到我的WPF应用程序中有一个奇怪的行为.如果Image在a MenuItem和a Button中使用ToolBar,当我打开时Menu,图像消失在Button.
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Image x:Key="NewImage"
Source="/SomeApplication;component/Resources/NewDocumentHS.png"
Stretch="None"/>
<!-- ... -->
Run Code Online (Sandbox Code Playgroud)
来自的相关XAML Window:
<Menu>
<MenuItem Header="_File">
<MenuItem Header="_New"
Command="{Binding NewCommand}"
Icon="{DynamicResource NewImage}" />
<!-- ... -->
<ToolBarTray>
<ToolBar>
<Button Command="{Binding NewCommand}"
Content="{DynamicResource NewImage}" />
Run Code Online (Sandbox Code Playgroud)
我认为这是一个资源的警告ResourceDictionary,但我无法找到适当的解决方案.行为发生在StaticResource和DynamicResource.它似乎也不受影响,如果ResourceDictionary它自己的立场或它是否与其他人合并.没有其他资源可以共享密钥.
编辑:此外,添加PresentationOptions:Freeze="True"到图像并没有改变这种情况.
有一个WPF用户控件库和两个(或更多)用户控件.我需要在两个用户控件中使用相同的样式.我该如何分享这种风格?例如:
这是风格:
<Style x:Key="customLabelStyle" TargetType="Label">
...
</Style>
Run Code Online (Sandbox Code Playgroud)
用户控制A:
<UserControl x:Class="Edu.Wpf.Example.UserControlA"
...xmlns stuff... >
<Grid>
... some xaml markup...
<Label Style="{StaticResource customLabelStyle}"/>
</Grid>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
UserControl B:
<UserControl x:Class="Edu.Wpf.Example.UserControlB"
...xmlns stuff... >
<Grid>
... some another xaml markup...
<Label Style="{StaticResource customLabelStyle}"/>
</Grid>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
那么如何在不涉及应用程序app.xaml资源字典的情况下在库中的用户控件之间共享此样式?
UPDATE
我可以将Themes\Generic.xaml添加到我的库中并在那里定义样式.但在这种情况下,我必须使用ComponentResourceKey作为样式的关键.对?它很长而且不是很方便的表达......
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<LinearGradientBrush x:Key="ButtonNormalBackgroundBrush" EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#C10099FF" Offset="0"/>
<GradientStop Color="#C16699CC" Offset="1"/>
<GradientStop Color="#C1006699" Offset="0.49"/>
</LinearGradientBrush>
<ResourceDictionary/>
Run Code Online (Sandbox Code Playgroud)
现在我想从ResourceDictonary获取LinearGradientBrush并将其动态应用于按钮作为wpf中的背景颜色.
BtnGetBrushes.Background = Brushes.Green;
Run Code Online (Sandbox Code Playgroud)
我想应用上面的颜色而不是这个(Brushes.Green).我该怎么办?
我有几个DataTemplates ResourceDictionary:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:z="clr-namespace:ZoomPan">
<DataTemplate DataType="{x:Type z:Circle}">
<z:Circle Center="{Binding Center}" Radius="{Binding Radius}" x:Name="circle"/>
<DataTemplate.Triggers>
<DataTrigger ... />
</DataTemplate.Triggers>
</DataTemplate>
.... etc.
</ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)
我用它来Window:
<z:MyUserControl>
<z:MyUserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Dictionary.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</z:MyUserControl.Resources>
</z:MyUserControl>
Run Code Online (Sandbox Code Playgroud)
DataTemplates和触发器工作正常.
我有两个问题:
为什么ResourceDictionary中的DataTemplates不需要ax:Key?
我可以在某个部分用一个Key划分ResourceDictionary,然后指向一个部分中的DataTemplates吗?
创建一个名为的新WPF项目: xmlnsError
添加引用 PresentationFramework.Aero
将此添加ResourceDictionary到App.xaml:
<ResourceDictionary Source="/PresentationFramework.Aero,Version=4.0.0.0,Culture=Neutral,PublicKeyToken=31bf3856ad364e35,processorArchitecture=MSIL;component/themes/Aero.NormalColor.xaml"/>
Run Code Online (Sandbox Code Playgroud)
这样做会显示警告
Assembly 'PresentationFramework.Aero,Version=4.0.0.0,Culture=Neutral,PublicKeyToken=31bf3856ad364e35,processorArchitecture=MSIL' is not referenced by this project
Run Code Online (Sandbox Code Playgroud)
我已经仔细检查以确保版本实际上4.0.0.0并且PublicKeyToken实际上是31bf3856ad364e35通过导航到C:\Windows\Microsoft.NET\assembly\GAC_MSIL\PresentationFramework.Aero以及在运行时通过查看来自的AssemblyInfo来检查GACAppDomain.CurrentDomain.GetAssemblies();
有没有办法解决这个警告?这是WPF Windows 8兼容性问题的后续问题
TLDR;
屏幕ResourceDictionary在运行时正确地引用VS2015样式的外部文件,但不是在设计时.是什么赋予了?
在工作中,我们有一个WinForms产品,其中包含许多 WinForms屏幕,一个开发人员主动添加新的屏幕,以及一些WPF屏幕,我添加了新的.在现有的WPF屏幕中注意到很多重复的代码/样式,我创建了一个单独的项目来容纳这个 - 由所有现有/未来的WPF屏幕引用.
项目: WpfHelper
WpfHelper.dll 部署到 ...\Trunk\Project\Externals...\Trunk\Utilities\WpfHelper\WpfHelper\Resources\GlobalResources.xaml
我已...\Trunk\Project\Externals\WpfHelper.dll在六个项目中引用,将以下代码添加到每个资源文件中:
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/WpfHelper;Component/Resources/GlobalResources.xaml" />
</ResourceDictionary.MergedDictionaries>
Run Code Online (Sandbox Code Playgroud)
所有屏幕都位于...\Trunk\Project\Plugins.
????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
? ? Resource Works? ? Platform Target ? Target Framework ? Reference File Path ?
????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
? Project1 ? Succeeded ? Any CPU ? .NET 4.6 ? ...\Project1\Project1\Resources\Resources.xaml ?
? Project2 ? Succeeded ? x86 ? .NET 4.6 ? ...\Project2\Project2\Resources\Resources.xaml ?
? Project3 ? Succeeded ? Any …Run Code Online (Sandbox Code Playgroud) 我搜索高低,无法找到答案.我有两个问题
这是我在资源字典中尝试过的,但都不起作用
<ItemsControl x:Key="stateList">
<sys:String>AL</sys:String>
<sys:String>CA</sys:String>
<sys:String>CN</sys:String>
</ItemsControl>
<ItemsControl x:Key="stateList2">
<ComboBoxItem>AL</ComboBoxItem>
<ComboBoxItem>CA</ComboBoxItem>
<ComboBoxItem>CN</ComboBoxItem>
</ItemsControl>
Run Code Online (Sandbox Code Playgroud)
这就是我如何绑定它
<ComboBox SelectedValue="{Binding Path=State}" ItemsSource="{Binding Source={StaticResource stateList2}}" >
</ComboBox>
Run Code Online (Sandbox Code Playgroud)
编辑:更新
我得到了第一部分以这种方式工作
<col:ArrayList x:Key="stateList3">
<sys:String>AL</sys:String>
<sys:String>CA</sys:String>
<sys:String>CN</sys:String>
</col:ArrayList>
Run Code Online (Sandbox Code Playgroud)
但是,我宁愿不使用数组列表,我想使用通用列表,所以如果有人知道如何请让我知道.
编辑更新:我猜XAML对泛型的支持非常有限,所以也许数组列表是我现在能做的最好的,但是我仍然希望第二个问题的帮助,如果有人有一个anser
第2位.我尝试在我的XAML中引用合并的资源字典并遇到问题,因为在Window.resources下我不仅仅是字典,所以它要求我添加x:Key.添加密钥后,系统将无法再找到资源字典中的项目.我不得不将合并的字典移动到Grid.Resources.理想情况下,我想在app.xaml中引用合并的字典,但我有同样的问题
这是一些示例代码.第一部分需要一个x:key来编译,因为我有转换器并且它抱怨每个项目必须有一个键,如果有多个
<UserControl.Resources>
<win:BooleanToVisibilityConverter x:Key="VisibilityConverter" />
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/ResourcesD.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
Run Code Online (Sandbox Code Playgroud)
我不得不改变它
<UI:BaseStep.Resources>
<win:BooleanToVisibilityConverter x:Key="VisibilityConverter" />
</UI:BaseStep.Resources>
<Grid>
<Grid.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/ResourcesD.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Grid.Resources>
</Grid>
Run Code Online (Sandbox Code Playgroud)
谢谢
我需要在资源字典后面添加代码,如本问题所述.(我知道这不是一个好习惯,但它应该基于链接问题的评论工作.)我用x:Class属性引用代码:
XAML(单独的资源字典文件):
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="MyNamespace.MyStandardResources">
...
</ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)
码:
using System.Windows;
namespace MyNamespace
{
public partial class MyStandardResources : ResourceDictionary
{
public MyStandardResources()
{
InitializeComponent();
}
//...
}
}
Run Code Online (Sandbox Code Playgroud)
这会导致运行时解析器异常:
分析器内部错误:对象编写器 ' xClassNotDerivedFromElement '.System.Windows.Application.LoadComponent中的[Line:xxx Position:xxx].
资源包含在带有ResourceDictionary.MergedDictionaries标记的App.xaml中.