标签: resourcedictionary

动态加载资源字典文件到wpf应用程序会出错

我正在尝试使用该语句动态添加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.我仍然得到这个错误.有人可以帮我指出什么错?

附加信息 -

  • 我不想将xaml文件嵌入为资源
  • 当前项目是.net 3.5类库项目
  • 上面的mergedictionary语句是在属于同一个项目的类中编写的
  • 一旦我发现这不起作用(用于测试),我还手动添加了[assembly:AssemblyAssociatedContentFile("resources/leaf_styles.xaml")]

更新

如果我把它作为绝对位置,它正常工作.

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)

.net c# wpf xaml resourcedictionary

10
推荐指数
2
解决办法
3万
查看次数

合并的词典和本地资源

我有一个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)

wpf xaml dictionary resourcedictionary mergeddictionaries

10
推荐指数
1
解决办法
1万
查看次数

菜单打开时,XAML ResourceDictionary中的图像在ToolBar上消失

我已经开始将各种常见的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,但我无法找到适当的解决方案.行为发生在StaticResourceDynamicResource.它似乎也不受影响,如果ResourceDictionary它自己的立场或它是否与其他人合并.没有其他资源可以共享密钥.

编辑:此外,添加PresentationOptions:Freeze="True"到图像并没有改变这种情况.

wpf resourcedictionary

9
推荐指数
1
解决办法
4895
查看次数

在WPF用户控件库中的UserControl之间共享资源的最简单方法是什么?

有一个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作为样式的关键.对?它很长而且不是很方便的表达......

wpf user-controls resourcedictionary

9
推荐指数
2
解决办法
1万
查看次数

如何从资源字典中获取画笔并将其应用于动态元素在wpf中?

<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).我该怎么办?

c# wpf resourcedictionary

9
推荐指数
1
解决办法
2万
查看次数

在WPF中的ResourceDictionary中没有键的DataTemplate

我有几个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 xaml resourcedictionary

9
推荐指数
1
解决办法
4242
查看次数

"此项目未引用程序集"WPF资源字典中的错误

创建一个名为的新WPF项目: xmlnsError

添加引用 PresentationFramework.Aero

将此添加ResourceDictionaryApp.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兼容性问题的后续问题

.net c# wpf xaml resourcedictionary

9
推荐指数
1
解决办法
2699
查看次数

设计时错误查找资源字典 - 项目之间不一致

TLDR;

屏幕ResourceDictionary在运行时正确地引用VS2015样式的外部文件,但不是在设计时.是什么赋予了?


在工作中,我们有一个WinForms产品,其中包含许多 WinForms屏幕,一个开发人员主动添加新的屏幕,以及一些WPF屏幕,我添加了新的.在现有的WPF屏幕中注意到很多重复的代码/样式,我创建了一个单独的项目来容纳这个 - 由所有现有/未来的WPF屏幕引用.

项目: WpfHelper

  • 平台目标:任何CPU
  • 目标框架:.NET Framework 4.6
  • WpfHelper.dll 部署到 ...\Trunk\Project\Externals
  • ...\Trunk\Utilities\WpfHelper\WpfHelper\Resources\GlobalResources.xaml
    • 构建行动:页面
    • ResourceDictionary包含通用样式

我已...\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)

c# wpf resourcedictionary visual-studio-2015

9
推荐指数
1
解决办法
988
查看次数

将集合或数组添加到wpf资源字典中

我搜索高低,无法找到答案.我有两个问题

  1. 如何在XAML中创建数组或集合.我有一个数组,我想坚持在那里并绑定到一个组合框.我的第一个想法是将ItemsControl放在资源字典中,但组合框的ItemsSource需要IEnumerable,因此不起作用.

这是我在资源字典中尝试过的,但都不起作用

<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)

谢谢

wpf resourcedictionary

8
推荐指数
1
解决办法
2万
查看次数

在Silverlight中向Resource Dictionary添加Code Behind时出现xClassNotDerivedFromElement错误

我需要在资源字典后面添加代码,如本问题所述.(我知道这不是一个好习惯,但它应该基于链接问题的评论工作.)我用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中.

.net silverlight xaml code-behind resourcedictionary

8
推荐指数
2
解决办法
2589
查看次数