How can a WPF UserControl inherit a WPF UserControl?

前端 未结 5 1307
独厮守ぢ
独厮守ぢ 2020-11-28 21:46

The following WPF UserControl called DataTypeWholeNumber which works.

Now I want to make a UserControl called DataTypeDateTime and

相关标签:
5条回答
  • 2020-11-28 22:15

    There is partial class definition created by designer, you can open it easy way via InitializeComponent() method definition. Then just change partial class iheritence from UserControl to BaseDataType (or any you specified in class definition).

    After that you will have warning that InitializeComponent() method is hidden in child class.

    Therefore you can make a CustomControl as base clas instead of UserControl to avoid partial definition in base class (as described in one comment).

    0 讨论(0)
  • 2020-11-28 22:17
    public partial class MooringConfigurator : MooringLineConfigurator
        {
            public MooringConfigurator()
            {
                InitializeComponent();
            }
        }
    
    
    
    <dst:MooringLineConfigurator x:Class="Wave.Dashboards.Instruments.ConfiguratorViews.DST.MooringConfigurator"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:dst="clr-namespace:Wave.Dashboards.Instruments.ConfiguratorViews.DST"
        mc:Ignorable="d"
        d:DesignHeight="300" d:DesignWidth="400">
    
        <Grid x:Name="LayoutRoot" Background="White">
    
        </Grid>
    </dst:MooringLineConfigurator>    
    
    0 讨论(0)
  • 2020-11-28 22:30

    I found the answer in this article: http://www.paulstovell.com/xmlnsdefinition

    Basically what is says is that you should define an XML namespace in the AssemlyInfo.cs file, which can the be used in the XAML. It worked for me, however I placed the base user control class in a separate DLL...

    0 讨论(0)
  • 2020-11-28 22:31

    Ensure that you have changed the first tag in the xaml to also inherit from your new basetype

    So

    <UserControl x:Class="TestDependencyProperty827.DataTypes.DataTypeWholeNumber"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        
        xmlns:s="clr-namespace:System;assembly=mscorlib"
        >
    

    becomes

    <myTypes:BaseDataType x:Class="TestDependencyProperty827.DataTypes.DataTypeWholeNumber"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        
        xmlns:s="clr-namespace:System;assembly=mscorlib"
        xmlns:myTypes="clr-namespace:TestDependencyProperty827.DataTypes"
        >
    

    So, to summarise the complete answer including the extra details from the comments below:

    • The base class should not include a xaml file. Define it in a single (non-partial) cs file and define it to inherit directly from Usercontrol.
    • Ensure that the subclass inherits from the base class both in the cs code-behind file and in the first tag of the xaml (as shown above).
    0 讨论(0)
  • 2020-11-28 22:32

    I ran into the same issue but needed to have the control inherit from an abstract class, which is not supported by the designer. What solved my problem is making the usercontrol inherit from both a standard class (that inherits UserControl) and an interface. This way the designer is working.

    //the xaml
    <local:EcranFiche x:Class="VLEva.SIFEval.Ecrans.UC_BatimentAgricole" 
                      xmlns:local="clr-namespace:VLEva.SIFEval.Ecrans"
                      ...>
        ...
    </local:EcranFiche>
    
    // the usercontrol code behind
    public partial class UC_BatimentAgricole : EcranFiche, IEcranFiche
    {
        ...
    }
    
    // the interface
    public interface IEcranFiche
    {
       ...
    }
    
    // base class containing common implemented methods
    public class EcranFiche : UserControl
    {
        ... (ex: common interface implementation)
    }
    
    0 讨论(0)
提交回复
热议问题