Monday, February 06, 2012
 
   
 
Welcome to my site

First let me say thanks for stopping by my site. My name is David Hanson-Graville and I am a IT consultant working in the UK. Let me make it clear, I am passionate about technology and specifically .net and its various forms. I've programmed in a range of langages, but I can say, I am now at my happiest when coding with c#. I hope my blog is an enjoyable & educational read and please feel free to email me at David.Hanson@OnTheBlog.net if you have any questions. 

WPF: Extending the Page & UserControl base classes Minimize
Location: BlogsOnTheBlog    
Posted by: David Hanson Mon, 25 Feb 2008 22:50:15 GMT

When working with different .NET technologies it is often good practice to extend a number of bases classes for your own requirements.  There are couple of benefits for doing this.

  •  The derived classes provide a layer of protection/abstraction from the core framework so that changes can be managed more effectively. 
  • The derived classes provide the ability for you to extend base behaviour and share that throughout your application. 
  • You can increase testability.

Generally, when starting a new development, I like to do some of this infrastructure work upfront, this saves me a lot of refactoring down the line when I realise I need to extend a base class. Following this approach is particularly useful when working with .NET UI technologies such as WinForms, ASP.NET and WPF which implement a number of base classes upon which the majority of UI components are based. 

Below is an example of the standard WinForms model whereby each Form is derived from System.Windows.Forms.Form versus the model I implement when I intend to extend the base Form class.

 

FormEx implementation

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace Extended.Base.Example
{
    public class FormEx: Form
    {
    }

}

Our StandardForm implementation

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace Extended.Base.Example
{
    public partial class StandardForm : FormEx
    {
        public StandardForm()
        {
            InitializeComponent();
        }
    }

}

All this works fine and you can compile and run the application. WinForms will not care if we have extended System.Windows.Forms as long as we still have the class in our inheritance hierarchy and it adheres to the same contract.

Now I am currently working on a WPF XBAP application and I want to use the same pattern within the world of WPF. You would imagine that this should be a fairly simple task. Each Page derives from System.Windows.Control.Page and User controls derived from System.Windows.Controls.UserControl. Therefore, it would seem logical that all that is required is to create a number of new classes that inherit the appropriate base class and then allow our new pages/controls to inherit from these. Below is some simple code to reflect this approach in an XBAP.

Our new derived Page Class
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Controls;
 
namespace Demo
{
    public class PageEx: Page
    {
    }
}
 
A XAML page inheriting our extended class.
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
 
namespace Demo
{
    ///
    /// Interaction logic for Page1.xaml
    ///
    public partial class Page1 : PageEx
    {
        public Page1()
        {
            InitializeComponent();
        }
    }
}
 
And the XAML for our Page
 
<Page x:Class="Demo.Page1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Page1">
    <Grid>
       
    Grid>
Page>
 
 
All we should need to do now is compile and run our application.  If we do this, we notice that it’s not going to be as simple as we thought. Below is an error displayed from Visual Studio 2008.
 
 

The “Partial declarations of 'Your Type' must not specify different base classes” message is a standard compiler message that you can get whenever you implement a class using partial class files and then forget to may sure they all derive from the same base class. At first this error message seems a little odd as you only have one class in your solution window and that’s correctly deriving from PageEx.

The reason you encounter this error is due to the fact that WPF pages and controls have an auto generated file which is created by the compiler. This code is used for initialising the XAML document as some other gubbings.  Therefore we need to update this file to ensure it reflects our new base class. If you want to see this class all you need to do is place the cursor on the InitializeComponent, right click and then choose “Goto Definition”. Doing this will be present you with the following.

 
So now we can see where our problem is, we can update the generated file to the following.
 
    public partial class Page1 : PageEx, System.Windows.Markup.IComponentConnector
 

If you go about running the application the application runs with no problems.  But this is not the end of the story. After working elsewhere in your application you may find that all of sudden the issue of partial classes returns. Looking at the generated file you will notice that it has regressed back to inheriting from System.Windows.Controls.Page.

When I first encountered this I scratched my head for a little and performed a few google searches. I eventually found that the problem was not related to generated file but that my XAML also needed to amended to reflect the extended base class. Below is the updated XAML file which shows my new XAML.

<local:PageEx x:Class="Demo.Page1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:Demo"
    Title="Page1">
    <Grid>
       
    Grid>
local:PageEx>
 
The first step is to import the namespace where your extended Page class resides.
 
xmlns:local="clr-namespace:Demo"
 
Then we need to update our Pages opening and closing tags to reflect the new type using the namespace alias we defined. In this case called local
 
<local:PageEx x:Class="Demo.Page1"
 
Now if you run the application you will no longer receive the “Partial Class” error and you can get onto the fun stuff! You will also need to use the same approach if you plan to extend other WPF base classes.
   
Permalink |  Trackback

Your name:
Title:
Comment:
Security Code
Enter the code shown above in the box below
Add Comment   Cancel 
Tweets Minimize
Twitter / LordHanson
  1. LordHanson: #southeastern have once again proved their rolling stock can reach new lows.

    Published Wed, 01 Feb 2012 08:09:05 +0000 by
  2. LordHanson: Checked in at The Cards http://t.co/LANfHukb

    Published Sun, 29 Jan 2012 11:04:51 +0000 by
  3. LordHanson: @BillGates Run for president Bill.

    Published Fri, 27 Jan 2012 08:41:35 +0000 by
  4. LordHanson: @swhelband Again!

    Published Fri, 27 Jan 2012 08:39:44 +0000 by
  5. LordHanson: The update for the Nokia Lumia recently has done wonders for battery life! Good job #Nokia #windowsphone

    Published Fri, 27 Jan 2012 08:36:27 +0000 by
  6. LordHanson: Checked in at Victoria Station http://t.co/L0BJ5smd

    Published Thu, 26 Jan 2012 08:35:41 +0000 by
  7. LordHanson: @pdl_uk VAT No: 924 5933 08 Shoulder again! Dang!

    Published Wed, 25 Jan 2012 21:47:45 +0000 by
  8. LordHanson: @tommyjmquinn I think that would be easier. Next Thursday ok?

    Published Wed, 25 Jan 2012 21:04:46 +0000 by
  9. LordHanson: @tommyjmquinn London bridge doable?

    Published Wed, 25 Jan 2012 20:32:34 +0000 by
  10. LordHanson: @tommyjmquinn so where's the meet?

    Published Wed, 25 Jan 2012 19:04:02 +0000 by
  11. LordHanson: @tommyjmquinn your choice mate. Somewhere easy to get to from Bankside. :-D

    Published Tue, 24 Jan 2012 22:01:20 +0000 by
  12. LordHanson: @tommyjmquinn so Darius, Justin and me confirmed. Thursday good for you? Waiting to hear from Sal.

    Published Tue, 24 Jan 2012 21:47:21 +0000 by
  13. LordHanson: @mark_mann which is illegal I thought!

    Published Tue, 24 Jan 2012 21:46:17 +0000 by
  14. LordHanson: Details on Windows Phone 8 confirms NT kernel http://t.co/5Qg1MILl

    Published Tue, 24 Jan 2012 21:34:11 +0000 by
  15. LordHanson: But next target for framework is #winrt. Need to see if my dependencies like DI, RX, ReactiveUi etc will work. Hmm

    Published Mon, 23 Jan 2012 08:33:16 +0000 by
  16. LordHanson: @pdl_uk hey Phil, how's marathon training going?

    Published Mon, 23 Jan 2012 08:31:37 +0000 by
  17. LordHanson: So I now have a framework for apps which targets .net, Silverlight and windows phone. Thankyou project linker!

    Published Mon, 23 Jan 2012 08:28:08 +0000 by
  18. LordHanson: For some reason dropped twitter for a month. Can't say I missed it really. Maybe I need to broaden my follow list!

    Published Mon, 23 Jan 2012 08:24:44 +0000 by
  19. LordHanson: Soo much hype over SIRI when it came out yet I never see anyone use it and don't know anybody who does either. #apple #sooverhyped

    Published Mon, 23 Jan 2012 08:23:18 +0000 by
  20. LordHanson: #southeastern customer satisfaction survey given to me today. This should be fun! Bit wait......no extremely poor option! Just very poor.

    Published Mon, 23 Jan 2012 08:20:09 +0000 by
Print  
Archive Minimize
Print  
Contact me Minimize
Print  
Microsoft Certs Minimize







Print  
Silverlight News Minimize
Silverlight - Google News
  1. Windows Phone 8 - Silverlight Apps Are Legacy - iProgrammer

    Published Fri, 03 Feb 2012 13:03:27 GMT by
  2. Super Bowl Streaming Fail - StreamingMedia.com

    Published Mon, 06 Feb 2012 05:59:33 GMT by
  3. Delphi Developers Rejoice at Silverlight, FireMonkey and VCL Coming Together ... - San Francisco Chronicle (press release)

    Published Tue, 31 Jan 2012 17:34:58 GMT by
  4. WP7 Upgrades and WP8 - Silverlight or C++ - iProgrammer

    Published Tue, 31 Jan 2012 17:21:58 GMT by
  5. Watch The 2012 Super Bowl Online - SportsGrid

    Published Sun, 05 Feb 2012 23:15:21 GMT by
  6. US viewers can watch Super Bowl on Mac, iOS - Macworld

    Published Sun, 05 Feb 2012 20:22:31 GMT by
  7. Hydra 4 Sharpens Its Teeth, Breathes New Fire - Dr. Dobb's

    Published Sun, 05 Feb 2012 17:25:01 GMT by
  8. Will Silverlight live or die? Microsoft won't say - InfoWorld

    Published Fri, 27 Jan 2012 11:00:46 GMT by
  9. Cablevision Flips Live TV To Laptops With Microsoft Silverlight - Multichannel News

    Published Fri, 27 Jan 2012 17:24:53 GMT by
  10. Do SharePoint & Silverlight Have a Future Together? - CMSWire

    Published Mon, 16 Jan 2012 17:29:27 GMT by
Print