标签: resourcedictionary

WPF:样式基于另一个在单独的程序集中

程序集A - ResourceDictionary包含StyleA样式.
程序集B - ResourceDictionary.MergedDictionaries将程序集A中的资源合并到B.

我想在Assembly B"基于"StyleA创建一个样式.可能吗?

我正在尝试创建这种风格:

<Style x:Key="StyleB" BasedOn="{StaticResource StyleA}">
   <Setter Property="Button.Foreground" Value="Khaki"/>
</Style>
Run Code Online (Sandbox Code Playgroud)

但是如果我使用StyleB,我在运行时会得到一个XamlParseException异常:

无法将属性"Style"中的值转换为"System.Windows.Style"类型的对象.只能基于具有基本类型"IFrameworkInputElement"的目标类型的Style.标记文件'SamSeekApp; component/mainwindow.xaml'中对象'System.Windows.Controls.Button'出错

wpf resources styles resourcedictionary mergeddictionaries

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

如何在ResourceDictionary的源代码中设置相对路径/ Uri

我正在尝试引用MergedDictionaries.SharedStyles项目,该项目具有必须使用全部应用程序的所有样式.所以这里我在不同的文件夹下有不同的样式作为资源字典.所以最后我将它们合并到AllSharedStyles.xaml中,并在Styles项目级别进行.

现在我在Solution level <>中有另一个ResourceDictionary,它引用了AllSharedStyles.xaml资源字典<< >>.此ResourceDictionary作为链接添加到解决方案中的所有模块.

这里的问题是在我的SharedResourceDictionary中我有以下MergedDictionaries

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="/MergedDictionaries.SharedStyles;component/AllSharedStyles.xaml" />
    <ResourceDictionary Source="/View/LocalResource.xaml" /> 
</ResourceDictionary.MergedDictionaries>
Run Code Online (Sandbox Code Playgroud)

项目架构

我首先提到公共资源然后我的本地,以便覆盖(仅在需要时)任何特定于模块的样式.

现在,当我运行应用程序时,它会抱怨

'Set property 'System.Windows.ResourceDictionary.Source' threw an exception.' Line number '5' and line position '10'.
Run Code Online (Sandbox Code Playgroud)

那是错误信息.

根据我的理解,它正在寻找适当的参考.我也尝试使用Pack URL ref:Pack URLss.这是包网址:

 <ResourceDictionary Source="pack://application:,,,/MergedResourceDictionaries.Styles;component/component/AllSharedStyles.xaml" />
Run Code Online (Sandbox Code Playgroud)

所以关于如何在这里有相对路径的任何建议????

抱歉,我的描述/问题投射

wpf xaml resourcedictionary prism-4

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

是否可以在多个项目之间共享ResourceDictionary文件?

如果我在一个项目中有一个ResourceDictionary,是否可以创建另一个使用第一个项目中定义的资源的项目?请注意,这两个项目都是WPF应用程序,而不是ControlLibraries.

谢谢!!

c# wpf xaml resourcedictionary

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

XML命名空间中不存在标记

这个错误似乎遍布各地,但每个人似乎都有自己的解决方案,但没有一个解决了我的问题.

我收到一个资源字典的错误我正在制作(后来合并)XML命名空间'clr-namespace:Company.Project.Module.Folder; assembly = Company.Project.Module'中不存在标签'ModelBindings'

我引用的程序集是自定义的,包含在解决方案中.不仅如此,我们已经查看了放入资源字典所在项目的bin中的dll,并且在检查之后它包含了我想要引用的类.所以我知道1. dll在正确的位置被访问并且在引用中.2. dll包含我想要的数据.

以下是资源字典的一些代码

命名空间的列表

xmlns:modulemodel="clr-namespace:Company.Project.Module.Folder;assembly=Company.Project.Module"
Run Code Online (Sandbox Code Playgroud)

创建要引用的资源

<modulemodel:ModelBindings x:Key="ModuleModelBindings"/>
Run Code Online (Sandbox Code Playgroud)

就像其他人的错误一样,intellisense说它是犹太教徒.此外,xmlns列表是使用intellisense的自动完成功能创建的,并手动重新输入.都没有奏效.

我也尝试将所有内容移动到app.xaml,它仍然给了我同样的错误.

如果我删除ResourceDictionary文件的主体,代码编译得很好,但所有绑定都被破坏了.

最后,所有的资源定义都是在xaml文件中定义的,它们使用起来很好.它只是在我尝试从一个不起作用的不同项目创建它们之后.我改变了这个来修复错误,回到旧方法可能会有问题.

编辑:这是我在显示我正在使用的资源字典方面能做的最好的事情

<SharedResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:modulemodel="clr-namespace:Company.Project.Module.Folder;assembly=Company.Project.Module"
                    >
    <modulemodel:ModelBindings x:Key="ModuleModelBindings"/>

</SharedResourceDictionary>
Run Code Online (Sandbox Code Playgroud)

如果我用ResourceDictionary替换SharedResourceDictionary,则会发生相同的错误.

app.xaml和上面的SharedResourceDictionary在命名空间Company.Project.Main中进行了比较,并且它既引用了SharedResourceDictionary的定义,也引用了我在上面代码中放入的不同模块项目.

看起来它主要是用户错误.但这可能发生在其他人身上.当我从原始文件复制xmlns:moduleviewmodel定义时,我必须自己添加assembly =部分.就像我说的那样,我自己也做了,并且在输入'xmlns:moduleviewmodel ='时使用自动完成以下内容.在我们发现错误之前,我们再次尝试了自动完成,因为我们发现7个名称空间中没有一个没有生成错误.就在那时我注意到装配路径上有一封信没有大写.奇怪的是自动完成实际上自己插入了这个错误.我们编译的时候注意到了错误的字母.更奇怪的是,在我手动修复所有路径之后,我们再次尝试了自动完成功能并且拼写正确.

我不知道错误的自动完成的原因,但固定的字母,它编译得很好.

现在我只是想知道是否有人会相信自动完成功能正在改变我!

c# silverlight xaml resourcedictionary

18
推荐指数
4
解决办法
4万
查看次数

从程序集加载ResourceDictionary

我在文件系统的某个地方有一个程序集,例如"C:\ temp\test.dll".在那个程序集中有一个ResourceDictionary,例如"abc.xaml".

我怎样才能获得ResourceDictionary?也许有一种方法使用Reflections?到目前为止我没有找到解决方案.

提前致谢!

编辑:只是想添加我想要访问字典中的资源,例如样式.

c# wpf xaml resourcedictionary

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

以编程方式访问ResourceDictionary项

我有一个名为"MySilverlightControls"的Silverlight控件组件.几个文件夹进入该程序集我有一个类,它从第三方供应商扩展一个网格列,我们称之为"MyImageColumn.cs".

我还创建了一个名为的资源字典Generic.xaml,它位于Themes程序集的文件夹中.在那个资源字典中,我定义了一个名为MyImageColumnTemplate的ControlTemplate :

<ControlTemplate x:Name="MyImageColumnTemplate" >
    <Grid Margin="8,8,4,4" MaxHeight="32" MaxWidth="32">
        <Grid.Resources>
            <localGrid:StatusColumnImageConverter x:Key="ImageContentConverter"/>
        </Grid.Resources>
        <Border Margin="5,5,0,0" Background="Black" Opacity="0.15" CornerRadius="5" />
        <Border Background="#FF6E6E6E" CornerRadius="4,4,4,4" Padding="4" Margin="0,0,5,5">
            <Border Background="White" CornerRadius="2,2,2,2" Padding="3">
                <Image Source="{Binding EditValue, Converter={StaticResource ImageContentConverter}}" Stretch="Uniform"/>
            </Border>
        </Border>
    </Grid>
</ControlTemplate>
Run Code Online (Sandbox Code Playgroud)

我的问题是:从MyImageColumn,我如何以编程方式引用/加载此控件模板,以便将其分配给列上的属性?我希望使用类似这样的语法:

ControlTemplate ct = (ControlTemplate)Application.Current.Resources["MyImageColumnTemplate"];
Run Code Online (Sandbox Code Playgroud)

但是这总是返回null.当我在Reflector中加载程序集时,我看到Generic.xaml文件在那里,资源的名称是MySilverlightControls.g.resources,并且其中的路径是themes/generic.xaml.

我怎样才能获得此资源字典中的各个项目?

silverlight resources resourcedictionary controltemplate silverlight-3.0

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

在运行时切换wpf资源字典

我正在尝试构建一个允许用户在运行时更改主题的wpf应用程序.到目前为止我所做的是创建一个resourcedictionary,其中包含在其中定义的应用程序的所有颜色,然后我绑定到xaml中的这个字典.

下面是我切换资源字典的代码:

if (System.IO.File.Exists(fileName))
{
   using (FileStream fs = new FileStream(fileName, FileMode.Open))
   {
      ResourceDictionary dic = (ResourceDictionary)XamlReader.Load(fs);
      Resources.MergedDictionaries.Clear();
      Resources.MergedDictionaries.Add(dic);
   }
}
Run Code Online (Sandbox Code Playgroud)

这段代码运行正常,我知道它正在切换资源字典,但它不会更新已经显示在屏幕上的元素.我的问题是:我如何刷新或重新绑定屏幕以考虑新的资源字典?

谢谢

SM

c# data-binding wpf xaml resourcedictionary

16
推荐指数
1
解决办法
6788
查看次数

访问代码wpf中的资源字典

同一组件中的相同代码行适用于一个测试夹具,但不适用于另一个.这是代码行:

var dic = new ResourceDictionary { Source = new Uri("pack://application:,,,/MyApp.Wpf;component/ImageResources.xaml") };
Run Code Online (Sandbox Code Playgroud)

我在另一个测试夹具中得到的错误是System.UriFormatException:无效的URI:指定的端口无效.

uri字符串也适用于xaml.有没有更好的方法在代码中加载资源字典?

干杯,
Berryl

===更新===

正如我在这篇文章中发现的那样,由于没有注册包方案,因此发生了无效端口,这可以通过以下代码完成:

if (!UriParser.IsKnownScheme("pack"))
     UriParser.Register(new GenericUriParser(GenericUriParserOptions.GenericAuthority), "pack", -1);
Run Code Online (Sandbox Code Playgroud)

我猜测能够使用pack方案加载字典而没有错误的测试夹具是因为SUT是用户控件,并且在创建用户控件的实例时以某种方式加载资源.

wpf uri resourcedictionary

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

WPF - 资源未从Generic.xaml加载

主题\ Generic.xaml:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="WPF Commons;component/Controls/Layout/Foo/FooItem.xaml" />
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)

控制\布局\富\ FooItem.xaml:

<Style TargetType="{x:Type l:FooItem}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type l:FooItem}">
                <Border>
                    <ContentPresenter ContentSource="Header" />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)


如果我将整个样式复制到我的usercontrol资源中,它可以正常工作.但是,如果我不这样做,则usercontrol显示为空.在Expression Blend 4中,我右键单击并选择Edit Template>,但它不会让我选择Edit a Copy...哪个让我相信某些内容严重错误并且Generic.xaml未正确加载.我认为它是Generic.xaml,因为如果我删除MergedDictionary调用并将xaml样式直接复制/粘贴到Generic.xaml中,它仍然无效.

wpf custom-controls resourcedictionary generic.xaml

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

绑定为资源

我可以将a定义Binding为a Resource然后使用不同的Controls属性重用它吗?

例:

捆绑:

<Window.Resources>        
    <Binding x:Key="MyBinding" Path="MyProperty" Mode="TwoWay" />
</Window.Resources>
Run Code Online (Sandbox Code Playgroud)

在XAML中重用:

<TextBox Text="{StaticResource MyBinding}" />
Run Code Online (Sandbox Code Playgroud)

在声明Binding如上后我得到了错误:

"当前上下文中不存在名称'InitializeComponent'"

有没有办法Binding在不同的环境中重用相同的东西?

wpf xaml wpf-controls resourcedictionary

16
推荐指数
1
解决办法
5867
查看次数