参考这儿
参考这儿
img.Source=new BitmapImage(new Uri(@"d"\iamges\Background\1.jpg"));
使用相对uri:
img.Source=new BitmapImage(new Uri("images/1.jpg",UriKind.Relative));
img.Source=new BitmapImage(new Uri ("Pack://application:,,,/iamges/1.jpg"));
(这三个逗号实际上是三个转义的斜杠。换句话说,上面显示的包含应用程序URI的Pack URI 是以application:///开头)
路径的表示方法:
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));
img.Source=new BitmapImage(new Uri("ImageLibrary;v1.25;sd2sw34e432f;Component/Images/1.jpg",UriKind.Relative));
每个元素都有自己的资源集合,在检索资源时,WPF会从元素树中进行递归搜索,先查找控件自己的Resource属性,
如果没有这个资源,程序会沿着逻辑数向上一级控件查找,如果连最顶层容器都没有这个资源,
程序就会去查找Application.Resources(也就是程序的顶级资源),如果还没有,就抛出异常。
如何使项目中较多的资源文件变得有序,避免让WPF资源字典变得杂乱臃肿,
参考这儿
根据资源的层次,可以知道,所有的资源查找,若没有找到,最终都会到程序顶级资源即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");
把语言选中保存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值,实现字典切换语言跟随切换:
其实就是转换资源数据,清除原先语言数据换成现在选中的语言数据。
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”);