In che modo un UserControl di WPF può ereditare un UserControl WPF?

Il seguente UserControl di WPF ha chiamato DataTypeWholeNumber che funziona.

Ora voglio creare un UserControl chiamato DataTypeDateTime e DataTypeEmail , ecc.

Molte delle proprietà dipendenze saranno condivise da tutti questi controlli e quindi voglio mettere i loro metodi comuni in un BaseDataType e ognuno di questi UserControl eredita da questo tipo di base.

Tuttavia, quando lo faccio, ottengo l’ errore: la dichiarazione parziale potrebbe non avere classi base diverse .

Quindi, come posso implementare l’ereditarietà con UserControls, quindi le funzionalità condivise sono tutte nella class base?

using System.Windows; using System.Windows.Controls; namespace TestDependencyProperty827.DataTypes { public partial class DataTypeWholeNumber : BaseDataType { public DataTypeWholeNumber() { InitializeComponent(); DataContext = this; //defaults TheWidth = 200; } public string TheLabel { get { return (string)GetValue(TheLabelProperty); } set { SetValue(TheLabelProperty, value); } } public static readonly DependencyProperty TheLabelProperty = DependencyProperty.Register("TheLabel", typeof(string), typeof(BaseDataType), new FrameworkPropertyMetadata()); public string TheContent { get { return (string)GetValue(TheContentProperty); } set { SetValue(TheContentProperty, value); } } public static readonly DependencyProperty TheContentProperty = DependencyProperty.Register("TheContent", typeof(string), typeof(BaseDataType), new FrameworkPropertyMetadata()); public int TheWidth { get { return (int)GetValue(TheWidthProperty); } set { SetValue(TheWidthProperty, value); } } public static readonly DependencyProperty TheWidthProperty = DependencyProperty.Register("TheWidth", typeof(int), typeof(DataTypeWholeNumber), new FrameworkPropertyMetadata()); } } 

Assicurati di aver modificato il primo tag in xaml per ereditare anche dal tuo nuovo tipo di base

Così

  

diventa

  

Quindi, per riassumere la risposta completa inclusi i dettagli extra dai commenti qui sotto:

  • La class base non dovrebbe includere un file xaml. Definirlo in un unico file cs (non parziale) e definirlo per ereditare direttamente da Usercontrol.
  • Assicurati che la sottoclass erediti dalla class base sia nel file cs code-behind sia nel primo tag di xaml (come mostrato sopra).
 public partial class MooringConfigurator : MooringLineConfigurator { public MooringConfigurator() { InitializeComponent(); } }     

Ho trovato la risposta in questo articolo: http://www.paulstovell.com/xmlnsdefinition

Fondamentalmente ciò che viene detto è che dovresti definire uno spazio dei nomi XML nel file AssemlyInfo.cs, che può essere usato in XAML. Ha funzionato per me, tuttavia ho inserito la class di controllo utente di base in una DLL separata …

Mi sono imbattuto nello stesso problema ma avevo bisogno di avere il controllo ereditato da una class astratta, che non è supportata dal progettista. Ciò che ha risolto il mio problema è che l’usercontrol eredita sia da una class standard (che eredita UserControl) sia da un’interfaccia. In questo modo il designer sta lavorando.

 //the xaml  ...  // 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) } 

Esiste una definizione di class parziale creata dal designer, è ansible aprirla in modo semplice tramite la definizione del metodo InitializeComponent (). Quindi modifica semplicemente l’iheritence della class parziale da UserControl a BaseDataType (o qualsiasi altro specificato nella definizione della class).

Dopodiché avvertirai che il metodo InitializeComponent () è nascosto nella class figlio.

Pertanto è ansible creare un CustomControl come base clase anziché UserControl per evitare la definizione parziale nella class base (come descritto in un commento).