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

WP7 如何禁用WebBrowser 控件缩放和左右移动

2013年11月01日 ⁄ 综合 ⁄ 共 2384字 ⁄ 字号 评论关闭

我认为有两种方法可以实现。

1, WebBrowser 是基于IE 9的,所以WebBrowser 也是支持最新的HTML5标准。然而在HTML中有许多控件是通过Browser的 pan 和zoom等手持行为起作用的,您可以设置HTML中的 viewport metadata 元素来实现。如:将下面的HTML代码加入到您的HTML文件头上。

<meta name="viewport" content="user-scalable=no" />

 

2, WebBroswer控件的组成是一棵树型结构如下图:

 

\-WebBrowser
  \-Border
    \-Border
      \-PanZoomContainer
        \-Grid
          \-Border (*)
            \-ContentPresenter
              \-TileHost

 

其中 TileHost 就是原始的IE9组件,TileHost 不处理所有的manipulation相关的事件,而是由PanZoomContainer来处理,将这些事件转换成手持,然后将结果传输到TileHost。

换句话说我们可以中断相关的manipulationg事件传输到PanZoomContainer。当这些事件还未bubble up到PanZoomContainer时,当这些事件设置为已经处理过。

这个方法的关键步骤有2步:

1, 需要从WebBroswer组件树中找到Border控件。请参考:http://www.scottlogic.co.uk/blog/colin/2010/03/linq-to-visual-tree/

2, 处理manipulation相关的事件,并设置该事件已经处理过 e.Handled = true;。

 

例如:

using LinqToVisualTree;

public class WebBrowserHelper

    {

        public  WebBrowser _browser;

 

        /// <summary>

        /// Gets or sets whether to suppress the scrolling of

        /// the WebBrowser control;

        /// </summary>

        public bool ScrollDisabled { get; set; }

 

        public WebBrowserHelper(WebBrowser browser)

        {

            _browser = browser;

            browser.Loaded += new RoutedEventHandler(browser_Loaded);

        }

 

        private void browser_Loaded(object sender, RoutedEventArgs e)

        {

            var border = _browser.Descendants<Border>().Last() as Border;

 

            border.ManipulationDelta += Border_ManipulationDelta;

            border.ManipulationCompleted += Border_ManipulationCompleted;

        }

 

        private void Border_ManipulationCompleted(object sender,

                                                  ManipulationCompletedEventArgs e)

        {

            // suppress zoom

            if (e.FinalVelocities.ExpansionVelocity.X != 0.0 ||

                e.FinalVelocities.ExpansionVelocity.Y != 0.0)

                e.Handled = true;

        }

 

        private void Border_ManipulationDelta(object sender,

                                              ManipulationDeltaEventArgs e)

        {

            // suppress zoom

            if (e.DeltaManipulation.Scale.X != 0.0 ||

                e.DeltaManipulation.Scale.Y != 0.0)

                e.Handled = true;

 

            // optionally suppress scrolling

            if (ScrollDisabled)

            {

                if (e.DeltaManipulation.Translation.X != 0.0 ||

                  e.DeltaManipulation.Translation.Y != 0.0)

                    e.Handled = true;

            }

        }

    }

抱歉!评论已关闭.