WPF comes with a ready to use WebBrowser control, which allows you
to host a complete web browser within your application. The WebBrowser
control is really
just a shell around an ActiveX version of Internet Explorer, but
since this is an integrated part of Windows, your application should
work on all Windows
machines without requiring the installation of additional
I've done things a bit differently in this article: Instead of
starting off with a very limited example and then adding to it, I've
create just one but
more complex example. It illustrates how easy you can get a small
web browser up and running. It's very basic in its functionality, but
you can easily
extend it if you want to. Here's how it looks:
So let's have a look at the code:
Title="WebBrowserControlSample" Height="300" Width="450">
<CommandBinding Command="NavigationCommands.BrowseBack" CanExecute="BrowseBack_CanExecute" Executed="BrowseBack_Executed" />
<CommandBinding Command="NavigationCommands.BrowseForward" CanExecute="BrowseForward_CanExecute" Executed="BrowseForward_Executed" />
<CommandBinding Command="NavigationCommands.GoToPage" CanExecute="GoToPage_CanExecute" Executed="GoToPage_Executed" />
<Image Source="/WpfTutorialSamples;component/Images/arrow_left.png" Width="16" Height="16" />
<Image Source="/WpfTutorialSamples;component/Images/arrow_right.png" Width="16" Height="16" />
<TextBox Name="txtUrl" Width="300" KeyUp="txtUrl_KeyUp" />
<Image Source="/WpfTutorialSamples;component/Images/world_go.png" Width="16" Height="16" />
<WebBrowser Name="wbSample" Navigating="wbSample_Navigating"></WebBrowser>
public partial class WebBrowserControlSample : Window
private void txtUrl_KeyUp(object sender, KeyEventArgs e)
if(e.Key == Key.Enter)
private void wbSample_Navigating(object sender, System.Windows.Navigation.NavigatingCancelEventArgs e)
txtUrl.Text = e.Uri.OriginalString;
private void BrowseBack_CanExecute(object sender, CanExecuteRoutedEventArgs e)
e.CanExecute = ((wbSample != null) && (wbSample.CanGoBack));
private void BrowseBack_Executed(object sender, ExecutedRoutedEventArgs e)
private void BrowseForward_CanExecute(object sender, CanExecuteRoutedEventArgs e)
e.CanExecute = ((wbSample != null) && (wbSample.CanGoForward));
private void BrowseForward_Executed(object sender, ExecutedRoutedEventArgs e)
private void GoToPage_CanExecute(object sender, CanExecuteRoutedEventArgs e)
e.CanExecute = true;
private void GoToPage_Executed(object sender, ExecutedRoutedEventArgs e)
The code might seem a bit overwhelming at first, but if you take a
second look, you'll realize that there's a lot of repetition in it.
Let's start off by talking about the XAML part.
Notice that I'm using several concepts discussed elsewhere in this
tutorial, including the
ToolBar control and WPF commands. The ToolBar is used to host a
couple of buttons for going backward and forward. After that, we have an
address bar for
entering and showing the current URL, along with a button for
navigating to the entered URL.
Below the toolbar, we have the actual WebBrowser control. As you can
see, using it only requires a single line of XAML - in this case we
subscribe to the Navigating event, which occurs as soon as the WebBrowser starts navigating to a URL.
In Code-behind, we start off by navigating to a URL already in the constructor of the Window, to have something to show immediately
instead of a blank control. We then have the txtUrl_KeyUp event, in which we check to see if the user has hit Enter inside of the address
bar - if so, we start navigating to the entered URL.
The wbSample_Navigating event makes sure that the
address bar is updated each time a new navigation starts. This is
important because we
want it to show the current URL no matter if the user initiated the
navigation by entering a new URL or by clicking a link on the webpage.
The last part of the Code-behind is simple handling of our commands:
Two for the back and forward buttons, where we use the CanGoBack and
decide whether they can execute, and the GoBack and GoForward
methods to do the actual work. This is very standard when dealing with
WPF commands, as
described in the commands section of this tutorial.
For the last command, we allow it to always execute and when it does, we use the Navigate() method once again.
As you can see, hosting and using a complete webbrowser inside of
your application becomes very easy with the WebBrowser control. However,
you should be
aware that the WPF version of WebBrowser is a bit limited when
compared to the WinForms version, but for basic usage and navigation, it
If you wish to use the WinForms version instead, you may do so using
the WindowsFormsHost, which is explained elsewhere in this tutorial.