Das folgende WPF UserControl heißt DataTypeWholeNumber und funktioniert.
Jetzt möchte ich ein UserControl mit den Namen DataTypeDateTime und DataTypeEmail usw. erstellen .
Viele der Abhängigkeitseigenschaften werden von all diesen Steuerelementen gemeinsam genutzt. Daher möchte ich ihre allgemeinen Methoden in einen BaseDataType einfügen und jedes dieser UserControls von diesem Basistyp erben lassen.
Wenn ich das mache, erhalte ich jedoch die Fehlermeldung: Teildeklaration hat möglicherweise keine unterschiedlichen Basisklassen .
Wie kann ich die Vererbung mit UserControls implementieren, sodass alle gemeinsam genutzten Funktionen in der Basisklasse enthalten sind?
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());
}
}
c#
wpf
xaml
user-controls
Edward Tanguay
quelle
quelle
Antworten:
Stellen Sie sicher, dass Sie das erste Tag in der xaml so geändert haben, dass es auch von Ihrem neuen Basistyp erbt
So
wird
Um die vollständige Antwort einschließlich der zusätzlichen Details aus den Kommentaren unten zusammenzufassen:
quelle
quelle
Ich habe die Antwort in diesem Artikel gefunden: http://www.paulstovell.com/xmlnsdefinition
Grundsätzlich heißt es, dass Sie in der Datei AssemlyInfo.cs einen XML-Namespace definieren sollten, der in der XAML verwendet werden kann. Es hat bei mir funktioniert, aber ich habe die Basis-Benutzersteuerungsklasse in einer separaten DLL platziert ...
quelle
Ich bin auf dasselbe Problem gestoßen, musste aber das Steuerelement von einer abstrakten Klasse erben lassen, die vom Designer nicht unterstützt wird. Was mein Problem gelöst hat, ist, dass die Benutzersteuerung sowohl von einer Standardklasse (die UserControl erbt) als auch von einer Schnittstelle erbt. Auf diese Weise arbeitet der Designer.
quelle
Es gibt eine teilweise Klassendefinition, die vom Designer erstellt wurde. Sie können sie einfach über die Methodendefinition InitializeComponent () öffnen. Ändern Sie dann einfach die teilweise Klassenvererbung von UserControl in BaseDataType (oder eine in der Klassendefinition angegebene).
Danach erhalten Sie eine Warnung, dass die InitializeComponent () -Methode in der untergeordneten Klasse ausgeblendet ist.
Daher können Sie ein CustomControl als Basisklasse anstelle von UserControl erstellen, um eine teilweise Definition in der Basisklasse zu vermeiden (wie in einem Kommentar beschrieben).
quelle