WPF的资源调用

WPF的资源调用总结

一、 资源是什么?

1、资源的定义

参考这儿

1、资源的分类

参考这儿

二、 资源怎么用?

1、引用同一个程序中的资源

(1)、使用相对Uri来引用资源,如下所示
img.Source=new BitmapImage(new Uri(@"d"\iamges\Background\1.jpg"));

使用相对uri:

img.Source=new BitmapImage(new Uri("images/1.jpg",UriKind.Relative));
(2)、使用更累赘的绝对Uri:
img.Source=new BitmapImage(new Uri ("Pack://application:,,,/iamges/1.jpg"));

(这三个逗号实际上是三个转义的斜杠。换句话说,上面显示的包含应用程序URI的Pack URI 是以application:///开头)

2、引用位于其他程序集中的资源

路径的表示方法:

Pack://application:,,,/AssemblyName;Component/ResourceName

例如:如果图像被嵌入到一个一引用的名称为ImageLibrary的程序集中,需要使用如下所示的URI:

img.Source=new BitmapImage(newUri(“Pack://application:,,,/ImageLibrary;Component/images/1.jpg"));

或者从更实用的角度,可以使用等价的相对Uri

img.Source =new BitmapImage(new Uri("ImageLibrary;Component/images/1.jpg",UriKind.Relative));

3、使用到了版本号的和公钥标识的强命名程序集

img.Source=new BitmapImage(new Uri("ImageLibrary;v1.25;sd2sw34e432f;Component/Images/1.jpg",UriKind.Relative));
4、若要引用图片资源,可以参考这儿

三、如何在不同的项目只调用自己的资源?

1、资源的层次

每个元素都有自己的资源集合,在检索资源时,WPF会从元素树中进行递归搜索,先查找控件自己的Resource属性,
如果没有这个资源,程序会沿着逻辑数向上一级控件查找,如果连最顶层容器都没有这个资源,
程序就会去查找Application.Resources(也就是程序的顶级资源),如果还没有,就抛出异常。

2、使用资源字典

如何使项目中较多的资源文件变得有序,避免让WPF资源字典变得杂乱臃肿,
参考这儿

3、在不同项目中只使用项目资源字典中的资源

根据资源的层次,可以知道,所有的资源查找,若没有找到,最终都会到程序顶级资源即Application.Resources中查找。
同时如果有两个资源文件A,B。先后加入Application.Resources中,A先B后,同时A,B中都存在一个资源,Key都为book,
如果我们调用book,最终查找到的是在B中定义的book.

根据以上特性,我们可以通过将要使用的资源字典最后加入应用程序资源中,这样就不用担心因为不同的资源字典中存在同名资源的情况。
实现代码如下:

            //为后台调用资源添加资源文件
            font = new LocalTool.Language.FontLanguage(); 
            //通过应用程序资源查找出当前的语言环境
            string name = typeof(CProject).Assembly.GetName().Name;
            //把当前项目要用的所有资源字典在下面初始化
 
            //语言资源
            ResourceDictionary newRD = Application.LoadComponent(new Uri("/"+ name + ";component/Resources/Fonts/" +
            font.FindResource("LanguageKey") + ".xaml", UriKind.Relative)) as ResourceDictionary;

            //样式资源
            ResourceDictionary newRD1 = Application.LoadComponent(new Uri("/" + name + ";component/Resources/" +
            "TI_H_StyleCollection" + ".xaml", UriKind.Relative)) as ResourceDictionary;

            //判断应用程序的资源合集中有没有只供项目使用的资源字典,及带有ProjectResource的资源字典,如果有将其删除
            for (int i = Application.Current.Resources.MergedDictionaries.Count-1; i >=0; i--)
            {
                ResourceDictionary resourceDictionary = Application.Current.Resources.MergedDictionaries[i];
                if (resourceDictionary.Contains("ProjectResource"))
                {
                    Application.Current.Resources.MergedDictionaries.RemoveAt(i);
                }
            }
            Application.Current.Resources.MergedDictionaries.Add(newRD);
            Application.Current.Resources.MergedDictionaries.Add(newRD1);

获取资源中的数据获取,通过Key获取value值:

	ResourceDictionary resourceDictionary = Application.Current.Resources.MergedDictionaries[0];
	object vars = App.Current.FindResource("NotFile");

简单双语言案例

建立语言文件夹放置语言字典:

WPF的资源调用_第1张图片WPF的资源调用_第2张图片

加载语言资源字典数据:

把语言选中保存Setting中每次启动默认使用前一次使用的语言

try
	{
		if (string.IsNullOrEmpty(Properties.Settings.Default.Language))
		{
			Properties.Settings.Default.Language = "Font-zh-CN";
			Properties.Settings.Default.Save();
		}
		langRd = Application.LoadComponent(new Uri(@"\Resources\Fonts\" + Properties.Settings.Default.Language + ".xaml", UriKind.Relative)) as ResourceDictionary;
	    //语言数据添加到本地资源字典中或者添加到当前程序资源字典中(后台代码获取资源数据时才有用,正常xmal直接绑定语言数据时不需要添加到本地或者当前程序资源字典中)
	    this.Resources.MergedDictionaries.Add(langRd);    //Application.Current.Resources.MergedDictionaries.Add(langRd);
	}
	catch (Exception ex)
	{
		MessageBox.Show(ex.Message);
	}

文本绑定语言字典数据:

界面的xmal中控件文本绑定语言字典中的value值,实现字典切换语言跟随切换:
WPF的资源调用_第3张图片

语言切换

其实就是转换资源数据,清除原先语言数据换成现在选中的语言数据。

private void LanguageChoice(object sender, RoutedEventArgs e)
{
	Button bt = sender as Button;
	try
	{
		langRd = Application.LoadComponent(new Uri(@"\Resources\Fonts\" + bt.Tag.ToString() + ".xaml", UriKind.Relative)) as ResourceDictionary;

		if (this.Resources.MergedDictionaries.Count > 0)
		{
			this.Resources.MergedDictionaries.Clear();
		}
		this.Resources.MergedDictionaries.Add(langRd);
	}
	catch (Exception ex)
	{
		MessageBox.Show(string.Format("{0}>>{1}", DateTime.Now.ToString(), ex.Message));
	}
	Properties.Settings.Default.Language = bt.Tag.ToString();
	Properties.Settings.Default.Save();
}

后台获取语言资源字典中的数据内容:
1:如果通过 this.Resources.MergedDictionaries.Add(langRd); 添加到本地程序资源字典中的可以使用如下方式获取
string a = this.FindResource(“NotFile”) as string;

2:如果通过 Application.Current.Resources.MergedDictionaries.Add(langRd); 添加当前资源字典中可以使用如下方式获取
object vars = App.Current.FindResource(“NotFile”);

你可能感兴趣的:(WPF)