Aufrufen und Überschreiben des Basistyps mit C++/WinRT
Wichtig
Wichtige Konzepte und Begriffe im Zusammenhang mit der Nutzung und Erstellung von Laufzeitklassen mit C++/WinRT findest du unter Verwenden von APIs mit C++/WinRT sowie unter Erstellen von APIs mit C++/WinRT.
Implementieren überschreibbarer Methoden wie MeasureOverride und OnApplyTemplate
Es gibt einige Erweiterungspunkte in XAML, an die Ihre Anwendung angeschlossen werden kann, z. B.:
Ein benutzerdefiniertes Steuerelement wird von der Laufzeitklasse Control abgeleitet, die wiederum selbst von Basislaufzeitklassen abgeleitet wird. Ferner stehen overridable
-Methoden von Control, FrameworkElement und UIElement zur Verfügung, die Sie in Ihrer abgeleiteten Klasse überschreiben können. Das folgende Codebeispiel veranschaulicht, wie das geht:
struct BgLabelControl : BgLabelControlT<BgLabelControl>
{
...
// Control overrides.
void OnPointerPressed(Windows::UI::Xaml::Input::PointerRoutedEventArgs const& /* e */) const { ... };
// FrameworkElement overrides.
Windows::Foundation::Size MeasureOverride(Windows::Foundation::Size const& /* availableSize */) const { ... };
void OnApplyTemplate() const { ... };
// UIElement overrides.
Windows::UI::Xaml::Automation::Peers::AutomationPeer OnCreateAutomationPeer() const { ... };
...
};
Überschreibbare Methoden werden in verschiedenen Sprachprojektionen unterschiedlich dargestellt. In C# werden überschreibbare Methoden beispielsweise in der Regel als geschützte virtuelle Methoden dargestellt. In C++/WinRT sind sie zwar weder virtuell noch geschützt, du kannst sie aber trotzdem überschreiben und eine eigene Implementierung verwenden, wie weiter oben gezeigt.
Wenn Sie eine dieser überschreibbaren Methoden in C++/WinRT überschreiben, darf Ihre runtimeclass
-IDL die Methode nicht deklarieren. Weitere Informationen zur base_type
-Syntax finden Sie im nächsten Abschnitt in diesem Thema (Aufrufen des Basistyps).
IDL
namespace Example
{
runtimeclass CustomVSM : Windows.UI.Xaml.VisualStateManager
{
CustomVSM();
// note that we don't declare GoToStateCore here
}
}
C++/WinRT
namespace winrt::Example::implementation
{
struct CustomVSM : CustomVSMT<CustomVSM>
{
CustomVSM() {}
bool GoToStateCore(winrt::Windows::UI::Xaml::Controls::Control const& control, winrt::Windows::UI::Xaml::FrameworkElement const& templateRoot, winrt::hstring const& stateName, winrt::Windows::UI::Xaml::VisualStateGroup const& group, winrt::Windows::UI::Xaml::VisualState const& state, bool useTransitions) {
return base_type::GoToStateCore(control, templateRoot, stateName, group, state, useTransitions);
}
};
}
Aufrufen des Basistyps
Sie können auf Ihren Basistyp zugreifen und Methoden darauf aufrufen, indem Sie den Typalias „base_type
“ verwenden. Wir haben ein Beispiel dafür im vorherigen Abschnitt gesehen; Sie können jedoch für den Zugriff auf ein beliebiges Basisklassenelement (nicht nur überschriebene Methoden) verwenden base_type
. Hier sehen Sie ein Beispiel:
struct MyDerivedRuntimeClass : MyDerivedRuntimeClassT<MyDerivedRuntimeClass>
{
...
void Foo()
{
// Call my base type's Bar method.
base_type::Bar();
}
};