追踪导致 WebBrowser控件 编辑模式下 Ctrl + Z 失效的原因 【求大侠佐证,这算不算是微软的Bug呢?】...


导致Ctrl  + Z失效的原因由以下2点连锁引发而导致:

1、为了解决 WebBrowser 控件导航时弹出“保存对话框”,使用了 this.webBrowser.Document.OpenNew(true); // 防止 弹出保存对话框, 该方法指示新的文本改变将会在新窗口中打开。

2、 由原因1导致 webBrowser 控件的编辑模式失效, 表面上看上去还是可以编辑的,但实际上新窗口内部已经不支持编辑了。

注:这里涉及到了WebBrowser控件的特殊性,它是由三层控件嵌套而成的,外面的两层是大概负责容器、 及 响应用户操作的, 而最内层的则是承载HTML标记,并通过渲染引擎展示HTML内容。用黑盒测试的方法推断,当使用webBrowser.Document.OpenNew(true);  方法时,最内层控件应该是一个新的实例, 表面上看上去还是可以编辑的,但实际上内部的新窗口已经不支持编辑了,进而导致了Ctrl + Z的失效!

测试代码如下:

public partial class FrmTest : Form
{
// 界面上有一个WebBrowser 和 4个Button

private string strUrl = " http://www.cnblogs.com/08shiyan " ;

public FrmTest()
{
InitializeComponent();
}

/// <summary>
/// 编辑模式
/// </summary>
public void EditMode()
{
if ( this .webBrowser1.Document != null )
{
mshtml.IHTMLDocument2 doc
= this .webBrowser1.Document.DomDocument as mshtml.IHTMLDocument2;
doc.designMode
= " on " ;
}
}

/// <summary>
/// 启用浏览模式
/// </summary>
public void BrowseMode()
{
if ( this .webBrowser1.Document != null )
{
mshtml.IHTMLDocument2 doc
= this .webBrowser1.Document.DomDocument as mshtml.IHTMLDocument2;
doc.designMode
= " off " ;
}
}

// 请确保该按钮是应用程序启动后第一次被点击
private void button1_Click( object sender, EventArgs e)
{
this .webBrowser1.DocumentText = string .Empty;
this .webBrowser1.Document.Write( string .Format( " <BODY>{0}我的誓言博客2</BODY> " , this .strUrl));
this .EditMode();

this .webBrowser1.Document.OpenNew( true );
this .webBrowser1.Document.Write( string .Format( " <BODY>{0}我的誓言博客2</BODY> " , this .strUrl));

// 注意此时Ctrl + Z 撤销操作将会失效
}

// 请确保该按钮是应用程序启动后第一次被点击
private void button2_Click( object sender, EventArgs e)
{
this .webBrowser1.DocumentText = string .Empty;
this .webBrowser1.Document.Write( string .Format( " <BODY>{0}我的誓言博客2</BODY> " , this .strUrl));
this .EditMode();

this .webBrowser1.Document.OpenNew( true );
this .webBrowser1.Document.Write( string .Format( " <BODY>{0}我的誓言博客2</BODY> " , this .strUrl));

this .EditMode(); // 与button1的差别是再次启用编辑模式 // 注意此时Ctrl + Z 撤销操作也会失效
}

// 请确保该按钮是应用程序启动后第一次被点击
private void button3_Click( object sender, EventArgs e)
{
this .webBrowser1.DocumentText = string .Empty;
this .webBrowser1.Document.Write( string .Format( " <BODY>{0}我的誓言博客2</BODY> " , this .strUrl));
this .EditMode();

this .webBrowser1.Document.OpenNew( true );
this .webBrowser1.Document.Write( string .Format( " <BODY>{0}我的誓言博客2</BODY> " , this .strUrl));

this .BrowseMode(); // 与button2 的区别是 先关闭编辑模式,再启用编辑模式
this .EditMode();

// 此时 Ctrl + Z 可以使用
}

// 重启应用程序
private void button4_Click( object sender, EventArgs e)
{
Application.Restart();
}

}

根据以上得出结论:
在“编辑模式”下: this.webBrowser.Document.OpenNew(true); 方法会打开一个新的“内部窗口”,而新窗口中“编辑模式”出现问题,导致Ctrl + Z ,Ctrl +Y操作失效。 此时 需要先关闭 “编辑模式” 然后再打开“编辑模式” Ctrl + Z, Ctrl +Y 才能正常使用。

求佐证。。。

原创 转载请标明出处: http://www.cnblogs.com/08shiyan

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值