Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Custom Baseclass for WPF-Control

I've created a CustomControl for my Project and I'm going to create some more. All these Controls will have something in common, so i created an abstract class which inherits from UserControl.

If I create a CustomControl via VisualStudio it also inherits from UserControl and I can't switch that to my abstract UserControl because VisualStudio will add some generated code files. I don't want to mess with these files.

I could just create a empty code file and write everything on my own, but then I can't use XAML(or I just don't know how yet).

So how do I create a CustomControl with a custom base class without losing XAML?

like image 666
Marcel B Avatar asked May 17 '11 19:05

Marcel B


1 Answers

First, you can't easily use abstract classes in a UserControl class hierarchy -- it doesn't work with the designer (you will get a "Cannot create an instance of "AbstractBase" message). Windows forms used to have the same issue, and there were some workarounds, all of which were painful.

After removing the "abstract", you should be able to reference your base class by including the namespace in your XAML definition, and changing the code behind like so:

<local:AbstractBase x:Class="Test.ConcreteControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:Test"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
    </Grid>
</local:AbstractBase>

And:

    /// <summary>
    /// Interaction logic for ConcreteControl.xaml
    /// </summary>
    public partial class ConcreteControl : AbstractBase
    {
        public ConcreteControl()
        {
            InitializeComponent();
        }
    }

This assumes that your base class is called "AbstractBase"

like image 55
micahtan Avatar answered Sep 28 '22 20:09

micahtan