windowsphone中WebBrowser中的页面按级回退功能

本文介绍了在Windows Phone应用开发中使用WebBrowser控件时遇到的问题:按下Back键时会直接返回到上一个PhoneApplicationPage,而非WebBrowser中的上一个网页。文章提供了两种JavaScript方法实现网页回退,并介绍了一个计数器模拟网页栈来区分网页回退和程序返回的解决方案。

在windowsphone应用开发中,我们会常用到WebBrowser这个控件。它可以浏览网页,并且可以在当前打开的网页中单击超级链接,继续打开新的网页。但是在操作中会存在这样一个问题,当按"Back"键希望返回前一个(上一级)网页时,程序会直接跳出当前的网页浏览器,直接返回到上一页面(客户端程序页面)。也就是说"Back"键会使程序返回程序的上一个PhoneApplicationPage,而不是WebBrowser中已打开过的前一个网页。

1.网页回退

我们普遍的做法会首先禁用掉Back键的功能,然后通过网页js的代码来实现网页的回退功能。在js有两种方法可以实现网页回退:

(1)Browser.InvokeScript("eval","history.go(-1)");

(2)Browser.InvokeScript("eval","history.back()");

2.退出网页/浏览器
上面的方法是不能使网页退出,而返回到上一级的程序页面的。那么在网页回到最初始页面时,是要启用Back的功能。为了在回退网页时禁用Back键,而在退出网页时启用Back,可以使用一个计数器来模拟打开的网页栈---
计数器初始化为1。打开新的网页时,计数器加一;回退网页时,计数器减一。当计数器记录为1时,此时按Back键可以实现网页的退出。

下面是简要代码:

using System;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;

namespace CustomControls
{
    public partial class ClockPage : PhoneApplicationPage
    {
        #region Data Members

        // 用于点击打开网页(非back键操作引起的)次数的统计
        private int m_PageStackCount = 0;
        // 标志是否为按Back键引起的网页跳转
        private bool m_BackKey = false;

        #endregion

        #region Constructor

        public ClockPage()
        {
            InitializeComponent();
        }

        #endregion

        #region Protected Methods

        protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
        {
            // 返回到上一级页面,此方法无法使网页退出,也就是最后只能退回到首页
            Browser.InvokeScript("eval", "history.back()");

            m_BackKey = true;

            if (m_PageStackCount > 1)
            {
                e.Cancel = true;
                m_PageStackCount -= 1;
            }
            else
            {
                // 退出网页
                e.Cancel = false;
            }
        }

        private void Browser_Navigated(object sender, NavigationEventArgs e)
        {
            if (m_BackKey == false)
            {
                m_PageStackCount += 1;               
            }
            else
            {
                m_BackKey = false;
            }
        }

        #endregion
    }
}


<think>好的,用户的问题是在C#的Windows窗体应用中使用WebBrowser控件实现网页打印功能的方法或代码示例。我需要先回忆一下WebBrowser控件的相关方法,然后结合打印功能来解答。 首先,WebBrowser控件有一个`Print`方法可以直接调用,这样用户不需要弹出打印对话框,直接打印当前加载的页面。不过用户可能需要更多的控制,比如显示打印对话框,调整设置等。这时候可能需要使用`ShowPrintDialog`方法,这个方法会显示标准的打印对话框,允许用户选择打印机和设置参数。 另外,用户可能还需要在打印前执行一些操作,比如修改页面的内容,或者处理打印完成后的回调。这时候可以考虑处理`DocumentCompleted`事件,确保页面完全加载后再执行打印操作,避免页面未加载完导致打印内容不全。 然后,我需要参考用户提供的引用内容。引用[1]中展示了如何添加WebBrowser控件并加载网页,引用[2]提到了处理DocumentCompleted事件,引用[3]比较了CefSharp和WebBrowser的选择。用户明确使用WebBrowser控件,所以不需要涉及CefSharp的部分。 接下来,我应该分步骤说明实现方法,包括基本打印、带对话框的打印以及自动打印。每个步骤给出代码示例,并解释关键点,比如确保页面加载完成再打印,避免异步问题。 可能的问题点包括:如何确保页面加载完毕后才执行打印?这可以通过在DocumentCompleted事件中调用打印方法来解决。另外,用户可能希望自定义打印设置,这时需要使用ShowPrintDialog方法而不是直接Print。 最后,生成相关问题,比如如何自定义打印内容、静默打印的实现,或者处理打印失败的情况。这些问题可以帮助用户进一步探索相关功能。</think>在C# WinForms中使用WebBrowser控件实现网页打印功能可通过以下步骤实现: ### 一、基础打印实现 ```csharp private void btnPrint_Click(object sender, EventArgs e) { // 确保网页加载完成 if (webBrowser.ReadyState == WebBrowserReadyState.Complete) { webBrowser.ShowPrintDialog(); // 显示打印对话框 // 或直接静默打印:webBrowser.Print(); } } ``` ### 二、带加载检测的完整示例 ```csharp public Form1() { InitializeComponent(); webBrowser.DocumentCompleted += WebBrowser_DocumentCompleted; webBrowser.Navigate("https://www.example.com"); } private void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { // 自动打印(慎用) // webBrowser.Print(); } private void btnAdvancedPrint_Click(object sender, EventArgs e) { // 显示打印预览对话框 webBrowser.ShowPrintPreviewDialog(); // 或设置打印参数 webBrowser.ShowPageSetupDialog(); webBrowser.ShowPrintDialog(); } ``` ### 三、关键特性说明 1. `ShowPrintDialog()`方法会触发系统标准打印对话框[^2] 2. `Print()`方法直接使用默认设置静默打印 3. 推荐在`DocumentCompleted`事件中执行打印操作以确保页面完整加载[^2] 4. 可通过`ExecWB`方法实现更底层控制: ```csharp webBrowser.ExecWB( OLECMDID.OLECMDID_PRINT, OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER, null, out _); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值