Frame和WebBrowser关系

当 Frame 控件导航到 HTML 内容时,Frame 控件在内部实例化本地WebBorwser ActiveX 控件。WPF 通过将功能控制应用于 WebBrowser ActiveX 控件来启用安全功能

因此,实际上,WPF中使用Frame来访问网页时,Frame内包含的东西并不是网页,而是WebBrowser,然后WebBrowser再访问网页,看起来,好像废话,理解这一点并不困难,WebBrowser依然是作为网页浏览的基本载体。

但是在编写代码时,理解这个道理非常重要,也非常容易疏忽。

在使用Frame访问或叫导航或叫装载Page对象时(Xaml),很直观,很容易理解,直接使用Frame的方法就可以完成一些操作,但是访问网页时,可能会出现意想不到的情况。

例如,使用Frame的Loaded或LoadCompleted方法时,会发现,网页还没加载完成这些事件就执行了。Loaded甚至是一开始就立刻执行了,LoadCompleted是在刚开始加载网页就执行的。

为什么会这样,似乎和Frame的这两个事件的描述不一样,但是在导航Page(Xaml)时就没问题。

详细阅读一下方法的说明和之前讲的Frame和WebBrowser的关系,其实可以找出答案。

还是以Loaded事件和LoadCompleted事件为例。

Loaded事件几乎在所有控件中都有,因此,Frame的Loaded方法和其他控件的Loaded是一样的,控件加载完成就触发。

LoadCompleted,这个对象是Frame内容加载完毕时触发的,看上去好像可以用这个方法来判断网页是否加载完毕,但是实际上依然不可以,为什么呢?如果Frame加载的是Page(Xaml),那么这个事件是管用的,但是,加载的是网页时,我们前面说过,Frame并没有直接加载网页,而是通过创建一个WebBrowser,然后这个WebBrowser再去加载网页,因此,Frame访问网页时,LoadCompleted是创建WebBrowser完成,而不是网页加载完成。

那么如何判断Frame中的网页是否加载完成呢?既然Frame并没自己加载网页,而是加载一个WebBrowser,然后由WebBrowser来加载网页,因此,我们要判断Frame中网页是否加载完成,其实依然是通过WebBrowser中的方法和事件来处理。这一点实际上又变回以前WinForm的操作方法了。

因此,我们在使用Frame来加载网页并与之互动时,需要记住,中间还有个WebBrowser,Frame只是创建一个WebBrowser,然后WebBrowser完成工作。Frame的Loaded只是自己完成时就触发,LoadCompleted事件是指WebBrowser实例化完成,网页加载完成是触发的WebBrowser的LoadCompleted。其他情况也遵循此原理。

还有一个地方要注意,在Frame触发LoadCompleted之前,Frame是还没有完成WebBrowser的创建的,因此,要想操作WebBrowser必须在LoadCompleted之后,否则会未实例化异常。

不要把WPF的Frame当做网页中的Frame来用了。

时间: 2024-10-08 10:30:58

Frame和WebBrowser关系的相关文章

MFC中文档模板的作用 View Doc Frame之间的关系

View和Doc由Frame来进行管理 (这些知识遇到去,对比查一下,就会加快阅读代码的速度).而文档模板DocTemplate将三者联系起来了. 单文档时框架窗口用CFrameWnd, 多文档时用CMDIFrameWnd和CMDIChildWnd. MDI子窗口(CMDIFrameWnd)与典型的框架窗口(CMDIFrameWnd)非常相似,唯一的区别在于MDI子窗口是出现在MDI框架窗口中,而不是在桌面上. MDI子窗口没有自己的菜单条,不过它可以共享MDI框架窗口.框架自动更改MDI框架的

frame 与 bounds的区别

今天在使用ios UICollectionView时,需要在collectionview的每一个item上添加一个label类型的子view.代码中设置了每一行显示七个item. 刚开始,我添加subview的方式如下: [[UILabel alloc] initWithFrame:self.frame]: 运行出的结果如下: 可以看到,只有四个label被显示出来了. 但是如果将label的初始化代码改为: [[UILabel alloc] initWithFrame:self.bounds]

iOS开发之 UIScrollView的frame、contentSize、contentOffset和contentInset属性

ios中下拉图片变大效果 http://blog.csdn.net/mad2man/article/details/14169197 IOS中UIScrollView的frame.contentSize.contentOffset和contentInset属性 (1) frame            :是指scrollview的可视范围(可看见的区域). (2)contentsize    :是其滚动范围.UIScrollView所有内容的尺?寸,也就是告诉 它滚动的范围(能滚多远,就滚多远)

iOS 中 UIView 和 CALayer 的关系

UIView 有一个名叫 layer ,类型为 CALayer 的对象属性,它们的行为很相似,主要区别在于:CALayer 继承自 NSObject ,不能够响应事件. 这是因为 UIView 除了负责响应事件 ( 继承自 UIReponder ) 外,它还是一个对 CALayer 的底层封装.可以说,它们的相似行为都依赖于 CALayer 的实现,UIView 只不过是封装了它的高级接口而已. 那 CALayer 是什么呢? CALayer(图层) 文档对它定义是:管理基于图像内容的对象,允许

contentSize、contentInset和contentOffset的区分

一.  frame.bounds和center的区分 frame:由左边原点和矩形面积组成,其中原点代表其在父视图中的起点位置. bounds:就是原点始终为(0,0)的frame. center:本身矩形的中心点,加上原点的偏移. 1. 如下图所示,假设白色底层为View1,照片为视图View2,则其中View2的: frame: {(40, 40), 240, 380) bounds:    {(0, 0), 240, 380) center:    (160, 230)  -> 240/2

openstack项目【day24】:VLAN模式

本节内容 一 二层基础知识 1.1 vlan介绍 1.1.1:vlan的含义 1.1.2:vlan的类型 1.1.3:vlan的不足 1.2 : 二层交换的基础知识 1.2.1:二层交换机最基本的功能 1.2.2:ARP协议 二 使用OpenvSwitch(OVS)+VLAN组网 2.1 物理VLAN网络配置 2.2 Neutron配置 2.2.1 配置进行 2.2.2 配置生效过程 2.3:创建虚拟网络和子网 2.3.1 创建命令 2.3.2 Neutron代码实现 2.4:Neturon虚拟

WindowState注意事项

本文将分析具体WindowState个别关键的成员变量和成员函数. Window #3 Window{20dd178e u0 com.android.mms/com.android.mms.ui.ConversationList}: mDisplayId=0 mSession=Session{cb5d53 25296:u0a10013} [email protected] mOwnerUid=10013 mShowToOwnerOnly=true package=com.android.mms

WebKit引擎快速的原因

在WebKit渲染网页之前,它需要将页面和所有引用的资源加载完毕.其中会涉及到不同层面的工作.在本文中,我将重点关注WebCore(WebKit中主要渲染组件)是如何在加载过程中发挥作用的. WebKit包含两条加载流水线,其中一条负责将凯时娱乐城文档加载到frames当中,另一条负责加载其他资源(比如图片.脚本一类).下图描述了两条流水线中涉及的主要对象. 加载Frames FrameLoader负责将文档加载到frames当中,当点击链接时,FrameLoader会创建一个新的Documen

contentSize、contentInset和contentOffset区别 分类: iphone开发

原文:http://blog.sina.com.cn/s/blog_a843a8850101dkhl.html 这几个都是在ios程序中,经常会注意到的一些小细节,能否真正了解这些,对写ios程序也有很大的好处. frame 是UIView中表示此view的一个矩形面积,包括了view在它的superview中的一些几何上的标识.有起始坐标,也就是origin(CGPoint)和这个矩形面积的宽(width)和高(height) bounds 每个view,除了有对应它的superview的相关