WPF中的xaml引用不同项目间资源的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF中的xaml引用不同项目间资源的问题相关的知识,希望对你有一定的参考价值。

初始启动项目A有资源文件在app.xml加载为字典资源ResourceDictionary,其中有<Style x:key="buttonStyle".../>
在其它项目中想调用A中的字典资料,在xaml文件中写
<Button Style="StaticResource buttonStyle",设计器总提示找不到资源buttonStyle
怎么做才能正确引用呢
2楼:
我不太明白你的意思,我本来是做winform的,但有个项目要修改(WPF做的),其中整个程序集里有25个项目,在vs2008里,我们肯定有一个初始启动项,而在初始启动项里定义了一个资源(ResourceDictionary)这个资源文件会在app.xaml里加载成资源ResourceDictionary,其中资源文件里有一个button的样式设置,
在其它24个项目中的button都是用这个样式,但在Vs2008里查看设计器的时候直接用<Button Style="StaticResource buttonStyle",会提示找不到资源buttonStyle,
但运行起来是正确的,因为资源应该是静态的,运行起来后内存有了,这是找得到的,
但在转到设计器查看的时候就不行,我想问的是这个怎么在设计器中查看
注:那个样式不单是图片,还包括很多其它的颜色,大小,鼠标事件等

其中resources中的images的btn.png的properties的Build Action要设置为resource,然后使用
<Image Source="/resources;component/Images/btn.png"/>即可,当让要引用resources工程,意思是告诉wpf去resource的dll中找到btn.png这个组件。
参考技术A Thread t1 = null;
Thread t2 = null;
private void Form1_Load(object sender, EventArgs e)

t1 = new Thread(new ThreadStart(T1));
t1.Start();
t2 = new Thread(new ThreadStart(T2));
t2.Start();


private void button1_Click(object sender, EventArgs e)

if (t1.ThreadState == ThreadState.Aborted||t1.ThreadState==ThreadState.Stopped)

MessageBox.Show("线程1结束了");
t1.Abort();

if (t2.ThreadState == ThreadState.Aborted||t1.ThreadState==ThreadState.Stopped)

MessageBox.Show("线程2结束了");
t2.Abort();


private void T1()

MessageBox.Show("进程1");


private void T2()

MessageBox.Show("进程2");

本回答被提问者采纳
参考技术B 工作目录的路径?

WPF--XAML资源

WPF--XAML资源

资源是可以在应用程序的不同位置重用的对象。XAML资源的示例包括画笔和样式。每个框架级别的元素(FrameworkElemen或FrameworkContentElement)都有一个resource属性,该属性包含资源定义的资源(作为ResourceDictionary)。可以在任何元素上定义资源,但是资源通常是在根元素上定义的。当在页面根元素上定义一个资源时,页面逻辑树中的所有元素都可以访问它,并且您可以重用相同的资源来设置接受该资源表示的类型的任何属性的值。

可以将资源引用为静态资源或动态资源。这可以通过使用StaticResource标记扩展或DynamicResource标记扩展来实现。通过替换已定义资源的值,StaticResource为属性提供了一个值,DynamicResource将属性值延迟为资源的运行时引用,从而为属性提供一个值。动态资源引用在每次访问此类资源并在运行时访问对象图时强制执行新的查找。为了获得这种访问,WPF属性系统中的依赖属性支持DynamicResource概念,并计算表达式。因此,只能对依赖项属性目标使用DynamicResource。

因此,资源的定义概括几点如下:

  • 与传统WEB应用中CSS样式表类似
  • 目的为了实现对象的重复使用
  • 有助于XAML代码重用,有助于应用维护的一致性
  • 定义资源的语法格式:

        <根元素对象.Resources>

        <资源定义>

        </根元素对象.Resources>

资源字典(ResourceDictionary)

如果想用代码创建一个完整的WPF应用程序,且可能还想用代码在该应用程序中创建任何资源。为此,创建一个新的ResourceDictionary实例,然后使用对ResourceDictionary.add .的连续调用将所有资源添加到字典中。然后,使用由此创建的ResourceDictionary在页面范围或Application.Resources中出现的元素上设置Resources属性。还可以将ResourceDictionary作为独立对象维护,而不需要将其添加到元素中。但是,如果您这样做,您必须按项目键访问其中的资源,就好像它是一个通用字典一样。资源字典中的每个资源必须有一个惟一的键。在标记中定义资源时,通过x: key指令分配惟一的键。通常,键是字符串;但是,你也可以通过使用适当的标记扩展将其设置为其他对象类型。定义资源之后,可以使用指定键名的资源标记扩展语法引用要用于属性值的资源。

资源字典分类

  • WPF应用程序中,XAML资源分为StaticResource(静态资源) 和DynamicResource(动态资源)
  • Windows8应用中,XAML资源仅支持StaticResource(静态资源)
  • 资源应用域不同,XAML资源可分为FrameworkElement.Resources和Application.Resources

(1)FrameworkElement.Resources是将资源对象应用于同一个对象数的不同对象

上,称之为页面资源,通常被定义在XAML页面根元素上。

(2)Application.Resources是贯穿整个应用级别的资源,通常被定义在App.xaml页面

1.1、FrameworkElement.Resources(页面资源字典)

1.2、Application.Resources(贯穿整个应用级别的资源)

1.3、合并资源字典属性

所有的资源项在最终都会被整合到Resource Dictionary中的,也就是说无论是FrameworkElement的Resources,还是Window的Resources,还是Application的Resources,还是特定的ResourceDictionary中定义的resources在整个应用编译执行的时候实际上他们都在一起的作为可遍历集合共同存在于一个相对会话空间内的。 我们也提到过Resource的key是可以被允许有相同的,这样在遍历不同相对地址的ResourceDictionary时会根据StaticResource或者DynamicResource的lookup behavior来确定哪个有效。通常为了维护和灵活性的考虑,我们通常会将Resource Dictionary文件分成好几个,但在某些场合下我们只需要用其中某些资源,那么我么可以将资源从几个独立的文件中提取并合并。部分App.xaml页面的代码如下:

XAML:

Resources资源包里面Dictionary.xaml

然后在App.xaml里面调用:

以上是关于WPF中的xaml引用不同项目间资源的问题的主要内容,如果未能解决你的问题,请参考以下文章

WPF--XAML资源

WPF--XAML资源

WPF--XAML资源

WPF 实现换肤功能

WPF和Silverlight的关系

2021-09-12 WPF上位机 06-资源字典与样式