Step 1: Create a helper class for the WebBrowser
- Imports System.Linq
- Imports System.Windows
- Imports System.Windows.Controls
- Imports System.Windows.Input
- Imports Microsoft.Phone.Controls
- Public ClassWebBrowserHelper
- Private _browser As WebBrowser
- ”’ <summary>
- ”’ Gets or sets whether to suppress the scrolling of
- ”’ the WebBrowser control;
- ”’ </summary>
- PublicProperty ScrollDisabled() As Boolean
- Get
- Return m_ScrollDisabled
- EndGet
- Set(value As Boolean)
- m_ScrollDisabled = value
- EndSet
- EndProperty
- Private m_ScrollDisabled As Boolean
- PublicProperty PinchDisabled() As Boolean
- Get
- Return m_PinchDisabled
- EndGet
- Set(value As Boolean)
- m_PinchDisabled = value
- EndSet
- EndProperty
- Private m_PinchDisabled As Boolean
- PublicSub New(browser AsWebBrowser)
- _browser = browser
- AddHandler browser.Loaded, NewRoutedEventHandler(AddressOf browser_Loaded)
- EndSub
- PrivateSub browser_Loaded(sender As Object, e As RoutedEventArgs)
- Dim border = TryCast(_browser.Descendants(OfBorder)().Last(), Border)
- AddHandler border.ManipulationDelta, AddressOf Border_ManipulationDelta
- AddHandler border.ManipulationCompleted, AddressOf Border_ManipulationCompleted
- EndSub
- PrivateSub Border_ManipulationCompleted(sender AsObject, e AsManipulationCompletedEventArgs)
- ‘ optionally suppress pinch
- IfPinchDisabled Then
- If e.FinalVelocities.ExpansionVelocity.X <> 0.0 OrElse e.FinalVelocities.ExpansionVelocity.Y <> 0.0 Then
- e.Handled = True
- EndIf
- EndIf
- EndSub
- PrivateSub Border_ManipulationDelta(sender AsObject, e AsManipulationDeltaEventArgs)
- ‘ optionally suppress pinch
- IfPinchDisabled Then
- If e.DeltaManipulation.Scale.X <> 0.0 OrElse e.DeltaManipulation.Scale.Y <> 0.0 Then
- e.Handled = True
- EndIf
- EndIf
- ‘ optionally suppress scrolling
- IfScrollDisabled Then
- If e.DeltaManipulation.Translation.X <> 0.0 OrElse e.DeltaManipulation.Translation.Y <> 0.0 Then
- e.Handled = True
- EndIf
- EndIf
- EndSub
- End Class
Step 2: Add the LinqToVisualTree module, used by the above class to help in locating the browser’s border control
- Imports System.Linq
- Imports System.Collections.Generic
- Imports System.Windows
- Imports System.Windows.Media
- Imports System.Runtime.CompilerServices
- <System.Runtime.CompilerServices.Extension()> _
- Module LinqToVisualTree
- ”’ <summary>
- ”’ Adapts a DependencyObject to provide methods required for generate
- ”’ a Linq To Tree API
- ”’ </summary>
- PublicClass VisualTreeAdapter
- ImplementsILinqTree(OfDependencyObject)
- Private _item As DependencyObject
- PublicSub New(item AsDependencyObject)
- _item = item
- EndSub
- PublicFunction Children() AsIEnumerable(Of DependencyObject) Implements ILinqTree(OfDependencyObject).Children
- Dim list As New List(OfDependencyObject)
- DimchildrenCount As Integer = VisualTreeHelper.GetChildrenCount(_item)
- For i As Integer = 0 To childrenCount – 1
- list.Add(VisualTreeHelper.GetChild(_item, i))
- Next
- Return list
- EndFunction
- PublicReadOnly Property Parent() AsDependencyObject ImplementsILinqTree(OfDependencyObject).Parent
- Get
- ReturnVisualTreeHelper.GetParent(_item)
- EndGet
- EndProperty
- EndClass
- ”’ <summary>
- ”’ Defines an interface that must be implemented to generate the LinqToTree methods
- ”’ </summary>
- ”’ <typeparam name="T"></typeparam>
- PublicInterface ILinqTree(Of T)
- Function Children() As IEnumerable(OfT)
- ReadOnlyProperty Parent() As T
- EndInterface
- ”’ <summary>
- ”’ Returns a collection of descendant elements.
- ”’ </summary>
- <Extension()>
- PublicFunction Descendants(item AsDependencyObject) AsIEnumerable(OfDependencyObject)
- Dim adapter As ILinqTree(OfDependencyObject) = NewVisualTreeAdapter(item)
- Dim list As New List(OfDependencyObject)
- ForEach child In adapter.Children()
- list.Add(child)
- Dim ad2 As ILinqTree(OfDependencyObject) = NewVisualTreeAdapter(child)
- ForEach grandChild In child.Descendants()
- list.Add(grandChild)
- Next
- Next
- Return list
- EndFunction
- ”’ <summary>
- ”’ Returns a collection containing this element and all descendant elements.
- ”’ </summary>
- <Extension()>
- PublicFunction DescendantsAndSelf(item AsDependencyObject) AsIEnumerable(OfDependencyObject)
- Dim list As New List(OfDependencyObject)
- list.Add(item)
- ForEach child In item.Descendants()
- list.Add(child)
- Next
- Return list
- EndFunction
- ”’ <summary>
- ”’ Returns a collection of ancestor elements.
- ”’ </summary>
- <Extension()>
- PublicFunction Ancestors(item AsDependencyObject) AsIEnumerable(OfDependencyObject)
- Dim adapter As ILinqTree(OfDependencyObject) = NewVisualTreeAdapter(item)
- Dim list As New List(OfDependencyObject)
- Dim parent = adapter.Parent
- While parent IsNot Nothing
- list.Add(parent)
- adapter = New VisualTreeAdapter(parent)
- parent = adapter.Parent
- EndWhile
- Return list
- EndFunction
- ”’ <summary>
- ”’ Returns a collection containing this element and all ancestor elements.
- ”’ </summary>
- <Extension()>
- PublicFunction AncestorsAndSelf(item AsDependencyObject) AsIEnumerable(OfDependencyObject)
- Dim list As New List(OfDependencyObject)
- list.Add(item)
- ForEach ancestor In item.Ancestors()
- list.Add(ancestor)
- Next
- Return list
- EndFunction
- ”’ <summary>
- ”’ Returns a collection of child elements.
- ”’ </summary>
- <Extension()>
- PublicFunction Elements(item AsDependencyObject) AsIEnumerable(OfDependencyObject)
- Dim list As New List(OfDependencyObject)
- Dim adapter As ILinqTree(OfDependencyObject) = NewVisualTreeAdapter(item)
- ForEach child In adapter.Children()
- list.Add(child)
- Next
- Return list
- EndFunction
- ”’ <summary>
- ”’ Returns a collection of the sibling elements before this node, in document order. ”’ </summary>
- <Extension()>
- PublicFunction ElementsBeforeSelf(item AsDependencyObject) AsIEnumerable(OfDependencyObject)
- Dim list As New List(OfDependencyObject)
- If item.Ancestors().FirstOrDefault() Is NothingThen
- ‘yield Exit Function
- ‘Exit Function
- Return list
- EndIf
- ForEach child In item.Ancestors().First().Elements()
- If child.Equals(item) Then
- Exit For
- EndIf
- list.Add(child)
- Next
- Return list
- EndFunction
- ”’ <summary>
- ”’ Returns a collection of the after elements after this node, in document order.
- ”’ </summary>
- <Extension()>
- PublicFunction ElementsAfterSelf(item AsDependencyObject) AsIEnumerable(OfDependencyObject)
- Dim list As New List(OfDependencyObject)
- If item.Ancestors().FirstOrDefault() Is NothingThen
- ‘yield Exit Function
- Return list
- ‘Exit Function
- EndIf
- DimafterSelf As Boolean = False
- ForEach child In item.Ancestors().First().Elements()
- IfafterSelf Then
- ‘yield Return child
- list.Add(child)
- EndIf
- If child.Equals(item) Then
- afterSelf = True
- EndIf
- Next
- Return list
- EndFunction
- ”’ <summary>
- ”’ Returns a collection containing this element and all child elements.
- ”’ </summary>
- <Extension()>
- PublicFunction ElementsAndSelf(item AsDependencyObject) AsIEnumerable(OfDependencyObject)
- Dim list As New List(OfDependencyObject)
- ‘yield Return item
- list.Add(item)
- ForEach child In item.Elements()
- ‘yield Return child
- list.Add(child)
- Next
- Return list
- EndFunction
- ”’ <summary>
- ”’ Returns a collection of descendant elements which match the given type.
- ”’ </summary>
- <Extension()>
- PublicFunction Descendants(Of T)(item AsDependencyObject) AsIEnumerable(OfDependencyObject)
- Return item.Descendants().Where(Function(i) TypeOf i Is T).Cast(OfDependencyObject)()
- EndFunction
- ”’ <summary>
- ”’ Returns a collection of the sibling elements before this node, in document order
- ”’ which match the given type.
- ”’ </summary>
- <Extension()>
- PublicFunction ElementsBeforeSelf(Of T)(item AsDependencyObject) AsIEnumerable(OfDependencyObject)
- Return item.ElementsBeforeSelf().Where(Function(i) TypeOf i Is T).Cast(OfDependencyObject)()
- EndFunction
- ”’ <summary>
- ”’ Returns a collection of the after elements after this node, in document order
- ”’ which match the given type.
- ”’ </summary>
- <Extension()>
- PublicFunction ElementsAfterSelf(Of T)(item AsDependencyObject) AsIEnumerable(OfDependencyObject)
- Return item.ElementsAfterSelf().Where(Function(i) TypeOf i Is T).Cast(OfDependencyObject)()
- EndFunction
- ”’ <summary>
- ”’ Returns a collection containing this element and all descendant elements
- ”’ which match the given type.
- ”’ </summary>
- <Extension()>
- PublicFunction DescendantsAndSelf(Of T)(item AsDependencyObject) AsIEnumerable(OfDependencyObject)
- Return item.DescendantsAndSelf().Where(Function(i) TypeOf i Is T).Cast(OfDependencyObject)()
- EndFunction
- ”’ <summary>
- ”’ Returns a collection of ancestor elements which match the given type.
- ”’ </summary>
- <Extension()>
- PublicFunction Ancestors(Of T)(item AsDependencyObject) AsIEnumerable(OfDependencyObject)
- Return item.Ancestors().Where(Function(i) TypeOf i Is T).Cast(OfDependencyObject)()
- EndFunction
- ”’ <summary>
- ”’ Returns a collection containing this element and all ancestor elements
- ”’ which match the given type.
- ”’ </summary>
- <Extension()>
- PublicFunction AncestorsAndSelf(Of T)(item AsDependencyObject) AsIEnumerable(OfDependencyObject)
- Return item.AncestorsAndSelf().Where(Function(i) TypeOf i Is T).Cast(OfDependencyObject)()
- EndFunction
- ”’ <summary>
- ”’ Returns a collection of child elements which match the given type.
- ”’ </summary>
- ”’
- <Extension()>
- PublicFunction Elements(Of T)(item AsDependencyObject) AsIEnumerable(OfDependencyObject)
- Return item.Elements().Where(Function(i) TypeOf i Is T).Cast(OfDependencyObject)()
- EndFunction
- ”’ <summary>
- ”’ Returns a collection containing this element and all child elements.
- ”’ which match the given type.
- ”’ </summary>
- <Extension()>
- PublicFunction ElementsAndSelf(Of T)(item AsDependencyObject) AsIEnumerable(OfDependencyObject)
- Return item.ElementsAndSelf().Where(Function(i) TypeOf i Is T).Cast(OfDependencyObject)()
- EndFunction
- ”’ <summary>
- ”’ Applies the given function to each of the items in the supplied
- ”’ IEnumerable.
- ”’ </summary>
- <Extension()>
- PrivateFunction DrillDown(items AsIEnumerable(Of DependencyObject), [function] As Func(OfDependencyObject, IEnumerable(OfDependencyObject))) AsIEnumerable(OfDependencyObject)
- Dim list As New List(OfDependencyObject)
- ForEach item In items
- ForEach itemChild In [function](item)
- ‘yield Return itemChild
- list.Add(itemChild)
- Next
- Next
- Return list
- EndFunction
- ”’ <summary>
- ”’ Applies the given function to each of the items in the supplied
- ”’ IEnumerable, which match the given type.
- ”’ </summary>
- <Extension()>
- PublicFunction DrillDown(Of T AsDependencyObject)(items AsIEnumerable(Of DependencyObject), [function] As Func(OfDependencyObject, IEnumerable(OfDependencyObject))) AsIEnumerable(OfDependencyObject)
- Dim list As New List(OfDependencyObject)
- ForEach item In items
- ForEach itemChild In [function](item)
- IfTypeOf itemChild Is T Then
- ‘yield Return DirectCast(itemChild, T)
- list.Add(DirectCast(itemChild, T))
- EndIf
- Next
- Next
- Return list
- EndFunction
- ”’ <summary>
- ”’ Returns a collection of descendant elements.
- ”’ </summary>
- <Extension()>
- PublicFunction Descendants(items AsIEnumerable(Of DependencyObject)) As IEnumerable(OfDependencyObject)
- Return items.DrillDown(Function(i) i.Descendants())
- EndFunction
- ”’ <summary>
- ”’ Returns a collection containing this element and all descendant elements.
- ”’ </summary>
- <Extension()>
- PublicFunction DescendantsAndSelf(items AsIEnumerable(Of DependencyObject)) As IEnumerable(OfDependencyObject)
- Return items.DrillDown(Function(i) i.DescendantsAndSelf())
- EndFunction
- ”’ <summary>
- ”’ Returns a collection of ancestor elements.
- ”’ </summary>
- <Extension()>
- PublicFunction Ancestors(items AsIEnumerable(Of DependencyObject)) As IEnumerable(OfDependencyObject)
- Return items.DrillDown(Function(i) i.Ancestors())
- EndFunction
- ”’ <summary>
- ”’ Returns a collection containing this element and all ancestor elements.
- ”’ </summary>
- <Extension()>
- PublicFunction AncestorsAndSelf(items AsIEnumerable(Of DependencyObject)) As IEnumerable(OfDependencyObject)
- Return items.DrillDown(Function(i) i.AncestorsAndSelf())
- EndFunction
- ”’ <summary>
- ”’ Returns a collection of child elements.
- ”’ </summary>
- <Extension()>
- PublicFunction Elements(items AsIEnumerable(Of DependencyObject)) As IEnumerable(OfDependencyObject)
- Return items.DrillDown(Function(i) i.Elements())
- EndFunction
- ”’ <summary>
- ”’ Returns a collection containing this element and all child elements.
- ”’ </summary>
- <Extension()>
- PublicFunction ElementsAndSelf(items AsIEnumerable(Of DependencyObject)) As IEnumerable(OfDependencyObject)
- Return items.DrillDown(Function(i) i.ElementsAndSelf())
- EndFunction
- ”’ <summary>
- ”’ Returns a collection of descendant elements which match the given type.
- ”’ </summary>
- <Extension()>
- PublicFunction Descendants(Of T AsDependencyObject)(items AsIEnumerable(Of DependencyObject)) As IEnumerable(OfDependencyObject)
- Return items.DrillDown(Of T)(Function(i) i.Descendants())
- EndFunction
- ”’ <summary>
- ”’ Returns a collection containing this element and all descendant elements.
- ”’ which match the given type.
- ”’ </summary>
- <Extension()>
- PublicFunction DescendantsAndSelf(Of T AsDependencyObject)(items AsIEnumerable(Of DependencyObject)) As IEnumerable(OfDependencyObject)
- Return items.DrillDown(Of T)(Function(i) i.DescendantsAndSelf())
- EndFunction
- ”’ <summary>
- ”’ Returns a collection of ancestor elements which match the given type.
- ”’ </summary>
- <Extension()>
- PublicFunction Ancestors(Of T AsDependencyObject)(items AsIEnumerable(Of DependencyObject)) As IEnumerable(OfDependencyObject)
- Return items.DrillDown(Of T)(Function(i) i.Ancestors())
- EndFunction
- ”’ <summary>
- ”’ Returns a collection containing this element and all ancestor elements.
- ”’ which match the given type.
- ”’ </summary>
- <Extension()>
- PublicFunction AncestorsAndSelf(Of T AsDependencyObject)(items AsIEnumerable(Of DependencyObject)) As IEnumerable(OfDependencyObject)
- Return items.DrillDown(Of T)(Function(i) i.AncestorsAndSelf())
- EndFunction
- ”’ <summary>
- ”’ Returns a collection of child elements which match the given type.
- ”’ </summary>
- <Extension()>
- PublicFunction Elements(Of T AsDependencyObject)(items AsIEnumerable(Of DependencyObject)) As IEnumerable(OfDependencyObject)
- Return items.DrillDown(Of T)(Function(i) i.Elements())
- EndFunction
- ”’ <summary>
- ”’ Returns a collection containing this element and all child elements.
- ”’ which match the given type.
- ”’ </summary>
- <Extension()>
- PublicFunction ElementsAndSelf(Of T AsDependencyObject)(items AsIEnumerable(Of DependencyObject)) As IEnumerable(OfDependencyObject)
- Return items.DrillDown(Of T)(Function(i) i.ElementsAndSelf())
- EndFunction
- ‘End Namespace
- End Module
Now, in your codebehind for XAML pages that use the WebBrowser control where you wish to suppress pinch or scroll, add the following declaration:
- Dim WithEvents MBH As WebBrowserHelper
Finally, in Public Sub New () of your codebehind of these XAML pages, associate this declared WebBrowserHelper with an actual WebBrowser (in this case named “MyWebBrowser”):
- MBH = New WebBrowserHelper(MyWebBrowser)
That’s it!
Adapted from C# to VB, and for completeness and accuracy, from:
- Suppressing Zoom and Scroll interactions in the Windows Phone 7 WebBrowser Control