Skip to main content

WPF Routing

WPF (3.5) introduced the concept of Routing that made the event routing easies in the scenarios where it was tedious to handle events. Consider a scenario where there are a number of Hyperlinks in a Panel that direct to separate locations on Click. Now if this is done in normal programming, each hyperlink will have to have code for execution. It would be easier and cleaner if we could handle the hyperlinks in the container (the Panel) that handles the click and redirects to appropriate location.

WPF handles the events with the following 3 strategies.

  • Direct events are like ordinary .NET events. They originate in one element and don’t pass to any other. For example, MouseEnter is a direct event.

  • Bubbling events are events that travel up the containment hierarchy. For example, MouseDown is a bubbling event. It is raised first by the element that is clicked. Next, it is raised by that element’s parent, and then by that element’s parent, and so on, until WPF reaches the top of the element tree.

  • Tunneling events are events that travel down the containment hierarchy. They give you the chance to preview (and possible stop) an event before it reaches the appropriate control. For example, PreviewKeyDown allows you to intercept a key press, first at the window level, and then in increasingly more specific containers until you reach the element that had focus when the key was pressed.


RoutedEventArgs Class:

  • Source indicates what object raised the event.

  • OriginalSource indicates what object originally raised the event. Usually the OriginalSource is the same the Source. But in some cases they could be different. For example, if you click close to the border of a window, you will get a Window object for the Source but a Border object for the OriginalSource.

  • RoutedEvent provides the RoutedEvent object for the event triggered by your event handler.

  • Handled allows you to halt the event bubbling or tunneling process.


Here is a simple example of when you might use a bubbling event:

<StackPanel Hyperlink.Click="StackPanel_Click">

        <TextBlock>

        <Hyperlink NavigateUri="http://www.google.com">Google</Hyperlink>

        </TextBlock>

        <TextBlock>

       <Hyperlink NavigateUri=http://gmail.com>Gmail</Hyperlink>

        </TextBlock>

        <TextBlock>

       <Hyperlink NavigateUri=http://facebook.com>FaceBook</Hyperlink>

        </TextBlock>

    </StackPanel>

And to handle the HyperLinks..

private void StackPanel_Click(object sender, RoutedEventArgs e)

        {

            Process.Start(((Hyperlink)e.Source).NavigateUri.ToString());

        }

So instead of having to create an event handler for each hyperlink, or creating a single event handler and pointing each hyperlink to the same event handler, one event handler on the parent element can be used.

This article just covered the Routing Basics and can serve as a base material to get started, However there is still lot that needs to be learnt and the who else, other than MSDN can teach it better.

Hope this was helpful,

Till Next we Connect…….

Happy Learning.

The Source Code can be downloaded from here

Comments

Popular posts from this blog

Asp.Net 4.0: An Overview-Part-III

This is the last post in the series which will explore the following new features of ASP.Net 4.0  Performance Monitoring for Individual Applications in a Single Worker Process Web.config File Refactoring Permanently Redirecting a Page Expanding the Range of Allowable URLs Performance Monitoring for Individual Applications in a Single Worker Process It is a common practice to host multiple ASP.NET applications in a single worker process, In order to increase the number of Web sites that can be hosted on a single server. This practice results in difficulties for server administrators to identify an individual application that is experiencing problems. ASP.NET 4 introduces new resource-monitoring functionality introduced by the CLR. To enable this functionality, following XML configuration snippet is added to the aspnet.config configuration file.(This file is located in the directory where the .NET Framework is installed ) <?xml version="1.0" encoding="UTF-8...

WPF –ElementHost

In response to WPF overview-Part-I , one of my friends and a .Net enthusiast herself, requested for details on ElementHost Class of WPF (this class gave her nightmares in not getting the Children attached to it). This might be true for many other developers who are specialized in Web Applications and  have lesser exposure to windows development. As a breather to all those folks, I am here exploring this class with sincere hopes that it will provide a good insight to the class.   ElementHost as described in MSDN is “a Windows Forms control that can be used to host a Windows Presentation Foundation (WPF) element” is located under System.Windows.Forms.Integration namespace . The members of this class have details available at this location . Why is this Class used? ElementHost control is used to place a WPF UIElement on to the Windows Forms control or form. In simple words, if a developer is using the traditional Windows forms and intends to use WPF controls, this control (class) is used...

Covariance and Contravariance-General Discussion

If you have just started the exploration of .Net Framework 4.0, two terms namely Covariance and Contravariance might have been heard. The concept that these terms encapsulate are used by most developer almost daily, however there has never been any botheration about the terminologies. Now, what actually these terms mean and how are these going to affect us as a developer, if we dive in to the details. The simple answer is it’s always good to know your tools before actually using them. Enough philosophy, let’s get to the business. Starting the discussion let me reiterate that in addition to Covariance and Contravariance, there is another terminology, Invariance. I’ll by start here by diving into the details of Invariance and then proceed further. Invariance: Invariance can be better understood by considering the types in .Net.>net has basically two type, value-types and reference-types. Value types (int, double etc) are invariant i.e. the types can’t be interchanged either ...