现在的位置: 首页 > 综合 > 正文

WPF、Silverlight程序编码资料收集

2012年11月07日 ⁄ 综合 ⁄ 共 8407字 ⁄ 字号 评论关闭

一.获取路径信息

1.   System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName
     获取模块的完整路径。
2.   System.Environment.CurrentDirectory
     获取和设置当前目录(该进程从中启动的目录)的完全限定目录。
3.   System.IO.Directory.GetCurrentDirectory()
     获取应用程序的当前工作目录。这个不一定是程序从中启动的目录啊,有可能程序放在C:\\www里,这个函数有可能返回C:\\Documents and Settings\\ZYB\\,或者C:\\Program Files\\Adobe\\,有时不一定返回什么东东,我也搞不懂了。
4.  System.AppDomain.CurrentDomain.BaseDirectory
     获取程序的基目录。
5.  System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase
     获取和设置包括该应用程序的目录的名称。
6. System.Windows.Forms.Application.StartupPath
     获取启动了应用程序的可执行文件的路径。效果和2、5一样。只是5返回的字符串后面多了一个"\\"而已
7.  System.Windows.Forms.Application.ExecutablePath
     获取启动了应用程序的可执行文件的路径及文件名,效果和1一样。

8.  在WPF中是无法使用myCollection["System_CurDirectory"] = Application.StartupPath;来获取当前程

    序路径的,应该这样用:myCollection["System_CurDirectory"] = System.IO.Path.GetDirectoryName (Process.GetCurrentProcess().MainModule.FileName);

 

二、获取SilverLight.Web项目中路径Uri

URI 是 Intranet 或 Internet 上可由应用程序使用的资源的一种简洁表示形式。Uri 类定义了属性和方法来处理 URI,包括分析、比较和组合。

Uri 类属性是只读的;若要创建可修改的对象,请使用 UriBuilder 类。

相对 URI(例如"/new/index.htm")必须相对于基 URI 展开,这样才是绝对的。提供了 MakeRelativeUri 方法,以便在必要时将绝对 URI 转换为相对 URI。

如果 URI 字符串是格式良好的 URI 并且包括方案标识符,Uri 构造函数将不会转义 URI 字符串。

Uri 属性用转义编码返回规范化数据表示形式,任何 Unicode 值大于 127 的字符都会被替换为等效的十六进制数。为使 URI 具有规范化格式,Uri 构造函数执行以下步骤:

  • 将 URI 方案转换为小写。

  • 将主机名转换为小写。

  • 如果主机名为 IPv6 地址,则使用规范化 IPv6 地址。ScopeId 和其他可选的 IPv6 数据将被移除。

  • 移除默认端口号和空端口号。

  • 通过压缩 /./、/../、// 等序列(包括转义表示形式),规范化分层 URI 的路径。请注意,在某些方案中,不压缩转义表示形式。

  • 对于分层 URI,如果主机未以正斜杠 (/) 结尾,则添加一个正斜杠。

  • URI 中的任何保留字符都要根据 RFC 3986 进行转义。

在某些方案的构造函数中,作为规范化工作的一部分,将压缩转义表示形式。其 URI 将压缩转义序列的方案包括:file、http、https、net.pipe 和 net.tcp。对于其他所有方案,不压缩转义序列。例如:如果您将两个点".."编码为百分号形式的"%2E%2E",则对于某些方案,URI 构造函数将压缩此序列。例如,下面的代码示例演示了 http 方案的 URI 构造函数。

代码

方法一:

//获取指定要呈现的xaml内容的包活xaml文件Uri
var strFullUrl = Application.Current.Host.Source.AbsoluteUri;
if (strFullUrl.IndexOf("ClientBin") > 0)
{
var uristr
= strFullUrl.Substring(0, strFullUrl.IndexOf("ClientBin")) + "Report/Default.aspx";
var uri
= new Uri(uristr);
}

方法二:

var uri = new Uri(App.Current.Host.Source, "../Report/Default.aspx");

方法三:

string url = System.Windows.Browser.HtmlPage.Document.DocumentUri.ToString();
var struri
= url.Substring(0, url.LastIndexOf("/")) + "/Report/Default.aspx";
var uri
= new Uri(struri);

方法四:

获取网页根目录

var xapUri = Application.Current.Host.Source;
var uri
= new Uri(xapUri, "../");

 

三、Silverlight里的URI引用资源文件的各种情况

主要介绍一下在silverlight里的资源文件(图片, 视频, 字体之类)设置不同的Build Action时在XAML或是后台C#里如何引用的问题.
就拿图片文件作例子来介绍各种Build Action的情况(选中一个文件后按F4打开vs属性面板就可以看到Build Action选项, 并可以更改)
假如我们有两个图片文件分别叫silverlight.png和sl.jpg, 把silverlight.png添加到应用的根目录里, 和我们的MainPage.xaml文件在一个文件夹, sl.jpg放到一个新建的images文件夹里
1. Resource:
选择这种生成方式后,该资源文件会被嵌入到该应用的程序集中,就是说打开生成的xap是看不到这个文件的.
可以用相对于当前的XAML文件的相对Uri访问, 如<Image Source="silverlight.png" />或是<Image Source="./silverlight.png" />, 在子文件夹里的可以用<Image Source=”./images/sl.jpg” />访问到
最保险的方式是采用特有的程序集资源URI访问,格式为
<Image Source="/{assemblyShortName};component/Foo.jpg"/>, 这种方式还可以引用到xap中的其他程序集中的图片
修改我们的两个图片的引用方式为

代码:

<Image Source="/SilverlightApplication1;component/silverlight.png"/>
<Image Source="/SilverlightApplication1;component/images/sl.jpg" Height="100"/>  

你可以发现一样可以正常显示
如果没找到文件的话,系统不会再找别的位置了, 会触发ImageFailed事件
在Build Action为Resource时, 可以用一下几种相对URI来引用资源文件

代码:

    <Image Source="/SilverlightApplication1;component/silverlight.png" Height="100"/>
    <Image Source="./silverlight.PNG" Height="100" />
    <Image Source="silverlight.PNG" Height="100" />
    <Image Source="/SilverlightApplication1;component/images/sl.jpg" Height="100"/>  
    <Image Source="./images/sl.jpg" Height="100" />

注意这种生成方式的系统资源可以直接用Application.GetResourceStream(uri).Stream在代码里来得到

2. Content:
用这种方式生成XAP后文件会被添加到xap文件中,用压缩工具打开我们生成的xap后可以看到我们的图片文件,silverlight.png在应用的"根"目录, 而sl.jpg文件存放在images文件夹中
这种情况下, 访问这两个图片的相对Uri需要以"/"开始

代码:

<Image Source="/silverlight.PNG" Height="100" />
<Image Source="/images/sl.jpg" Height="100" />

注意在这种方式下, 如果没有在xap中找到图片文件, 那么silverlight会自动从当前xap应用所在的文件夹下来找所需图片文件,如果还没有找到那么就触发ImageFailed事件, 这种方式比较适合在多个程序集引用相同文件时采用
3. None:
None表示不作生成处理, 我们的图片文件不会被拷贝到XAP文件中,需要考虑的是"CopyToOutputDirectory"这个选项, 这个选项有三个选择"Do not copy","Copy always","Copy if newer", 因为我们需要引用图片文件, 我们可以选择后两个中的一个,这样在项目编译后,可以看到在xap的所在文件里会有一个silverlight.png文件和一个images文件夹, sl.jpg文件就在images文件夹里
引用文件的Uri方式同第二种Content方式
在大多数情况下, 我们希望把video/audio文件放到xap的外面,因为这种文件一般都比较大, 会影响silverlight应用的加载, 而且一般的视频音频文件都是压缩格式的,放到xap中也不会起到减少他们文件大小的作用.
类似图片视频这种资源文件生成操作为None时和他们没有被添加到项目里是一样的, 都可以用绝对Uri进行引用
小结:
相对Uri引用:[/i]

代码:

<Image Source="/silverlight.PNG" Height="100" />
<Image Source="/images/sl.jpg" Height="100" />

[i]绝对路径引用:

 

代码:

<Image Source="http://localhost:50235/clientbin/silverlight.PNG" Height="100" />
<Image Source="http://localhost:50235/clientbin/images/sl.jpg" Height="100" />

4. EmbeddedResource:
这种方式会把文件嵌入到程序集中, silverlight无法通过Uri引用在xaml和c#里对这个文件进行使用, 微软不建议在silverlight采用这种方式在程序集里嵌入资源.
如果有这种需求可以用
Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(string path)相关的方法得到文件的stream引用
我建议直接改为第一种的"Resource"方式, 然后采用第一种的引用方式就可以了
关于Resource方式和EmbeddedResource的不同我不多介绍了, 如果感兴趣的话可以用reflector工具打开你的程序集dll文件, 在Resources目录下可以看到两者的不同之处, 用Resource嵌入的资源会被系统放到AppName.g.resources中,而采用EmbeddedResource方式的资源会被直接放到Resources目录下,其他的细节就不介绍了.

 Page:
    所有的用户控件, 页面和子窗体(usercontrol/page/childwindow)的xaml文件应该采用的生成操作, 如果改为别的方式那么会导致后台对应的代码文件无法链接到这个xaml文件, 采用"Page" build action时xaml里的错误会导致工程无法正确生成.
    Compile
    类文件要用"Compile"生成操作, 就是指项目里.cs或.vb文件
    ApplicationDefinition
    silverlight程序的入口xaml文件(默认就是App.xaml)应该设置为这个"应用定义"
    Entity Deploy
    这个是EntityFramework采用的生成方式, 在silverlight里是没用
    SplashScreen
     "SplashScreen"是这个选项是WPF的启动画面使用的,  silverlight启动加载画面是用的其他方式实现的, 所以在silverlight里不要用这个方式 。

 

 

主要介绍一下在silverlight里的资源文件(图片, 视频, 字体之类)设置不同的Build Action时在XAML或是后台C#里如何引用的问题.
就拿图片文件作例子来介绍各种Build Action的情况(选中一个文件后按F4打开vs属性面板就可以看到Build Action选项, 并可以更改)
假如我们有两个图片文件分别叫silverlight.png和sl.jpg, 把silverlight.png添加到应用的根目录里, 和我们的MainPage.xaml文件在一个文件夹, sl.jpg放到一个新建的images文件夹里
1. Resource:
选择这种生成方式后,该资源文件会被嵌入到该应用的程序集中,就是说打开生成的xap是看不到这个文件的.
可以用相对于当前的XAML文件的相对Uri访问, 如<Image Source="silverlight.png" />或是<Image Source="./silverlight.png" />, 在子文件夹里的可以用<Image Source=”./images/sl.jpg” />访问到
最保险的方式是采用特有的程序集资源URI访问,格式为
<Image Source="/{assemblyShortName};component/Foo.jpg"/>, 这种方式还可以引用到xap中的其他程序集中的图片
修改我们的两个图片的引用方式为

代码:

<Image Source="/SilverlightApplication1;component/silverlight.png"/>
<Image Source="/SilverlightApplication1;component/images/sl.jpg" Height="100"/>  

你可以发现一样可以正常显示
如果没找到文件的话,系统不会再找别的位置了, 会触发ImageFailed事件
在Build Action为Resource时, 可以用一下几种相对URI来引用资源文件

代码:

    <Image Source="/SilverlightApplication1;component/silverlight.png" Height="100"/>
    <Image Source="./silverlight.PNG" Height="100" />
    <Image Source="silverlight.PNG" Height="100" />
    <Image Source="/SilverlightApplication1;component/images/sl.jpg" Height="100"/>  
    <Image Source="./images/sl.jpg" Height="100" />

注意这种生成方式的系统资源可以直接用Application.GetResourceStream(uri).Stream在代码里来得到

2. Content:
用这种方式生成XAP后文件会被添加到xap文件中,用压缩工具打开我们生成的xap后可以看到我们的图片文件,silverlight.png在应用的"根"目录, 而sl.jpg文件存放在images文件夹中
这种情况下, 访问这两个图片的相对Uri需要以"/"开始

代码:

<Image Source="/silverlight.PNG" Height="100" />
<Image Source="/images/sl.jpg" Height="100" />

注意在这种方式下, 如果没有在xap中找到图片文件, 那么silverlight会自动从当前xap应用所在的文件夹下来找所需图片文件,如果还没有找到那么就触发ImageFailed事件, 这种方式比较适合在多个程序集引用相同文件时采用
3. None:
None表示不作生成处理, 我们的图片文件不会被拷贝到XAP文件中,需要考虑的是"CopyToOutputDirectory"这个选项, 这个选项有三个选择"Do not copy","Copy always","Copy if newer", 因为我们需要引用图片文件, 我们可以选择后两个中的一个,这样在项目编译后,可以看到在xap的所在文件里会有一个silverlight.png文件和一个images文件夹, sl.jpg文件就在images文件夹里
引用文件的Uri方式同第二种Content方式
在大多数情况下, 我们希望把video/audio文件放到xap的外面,因为这种文件一般都比较大, 会影响silverlight应用的加载, 而且一般的视频音频文件都是压缩格式的,放到xap中也不会起到减少他们文件大小的作用.
类似图片视频这种资源文件生成操作为None时和他们没有被添加到项目里是一样的, 都可以用绝对Uri进行引用
小结:
相对Uri引用:[/i]

代码:

<Image Source="/silverlight.PNG" Height="100" />
<Image Source="/images/sl.jpg" Height="100" />

[i]绝对路径引用:

 

代码:

<Image Source="http://localhost:50235/clientbin/silverlight.PNG" Height="100" />
<Image Source="http://localhost:50235/clientbin/images/sl.jpg" Height="100" />

4. EmbeddedResource:
这种方式会把文件嵌入到程序集中, silverlight无法通过Uri引用在xaml和c#里对这个文件进行使用, 微软不建议在silverlight采用这种方式在程序集里嵌入资源.
如果有这种需求可以用
Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(string path)相关的方法得到文件的stream引用
我建议直接改为第一种的"Resource"方式, 然后采用第一种的引用方式就可以了
关于Resource方式和EmbeddedResource的不同我不多介绍了, 如果感兴趣的话可以用reflector工具打开你的程序集dll文件, 在Resources目录下可以看到两者的不同之处, 用Resource嵌入的资源会被系统放到AppName.g.resources中,而采用EmbeddedResource方式的资源会被直接放到Resources目录下,其他的细节就不介绍了.

 Page:
    所有的用户控件, 页面和子窗体(usercontrol/page/childwindow)的xaml文件应该采用的生成操作, 如果改为别的方式那么会导致后台对应的代码文件无法链接到这个xaml文件, 采用"Page" build action时xaml里的错误会导致工程无法正确生成.
    Compile
    类文件要用"Compile"生成操作, 就是指项目里.cs或.vb文件
    ApplicationDefinition
    silverlight程序的入口xaml文件(默认就是App.xaml)应该设置为这个"应用定义"
    Entity Deploy
    这个是EntityFramework采用的生成方式, 在silverlight里是没用
    SplashScreen
     "SplashScreen"是这个选项是WPF的启动画面使用的,  silverlight启动加载画面是用的其他方式实现的, 所以在silverlight里不要用这个方式 。

抱歉!评论已关闭.