Aufrufen und Überschreiben Ihrer Basisklasse mit C++/WinRT

Important

Wichtige Konzepte und Begriffe, die Ihr Verständnis für die Nutzung und Erstellung von Laufzeitklassen mit C++/WinRT unterstützen, finden Sie unter Verwenden von APIs mit C++/WinRT und Erstellen von APIs mit C++/WinRT.

Implementieren überschreibbarer Methoden wie MeasureOverride und OnApplyTemplate

Es gibt einige Erweiterungspunkte in XAML, die Ihre Anwendung anschließen kann, z. B.:

Sie leiten ein benutzerdefiniertes Steuerelement von der Laufzeitklasse Control ab, die selbst wiederum von Basislaufzeitklassen abgeleitet ist. Außerdem gibt es overridable Methoden von Control, FrameworkElement und UIElement , die Sie in Ihrer abgeleiteten Klasse überschreiben können. Hier ist ein Codebeispiel, das zeigt, wie man das tun kann.

struct BgLabelControl : BgLabelControlT<BgLabelControl>
{
...
    // Control overrides.
    void OnPointerPressed(Microsoft::UI::Xaml::Input::PointerRoutedEventArgs const& /* e */) const { ... };

    // FrameworkElement overrides.
    Windows::Foundation::Size MeasureOverride(Windows::Foundation::Size const& /* availableSize */) const { ... };
    void OnApplyTemplate() const { ... };

    // UIElement overrides.
    Microsoft::UI::Xaml::Automation::Peers::AutomationPeer OnCreateAutomationPeer() const { ... };
...
};

Überschreibbare Methoden stellen sich in verschiedenen Sprachprojektionen anders dar. In C# werden überschreibbare Methoden beispielsweise in der Regel als geschützte virtuelle Methoden deklariert. In C++/WinRT sind sie weder virtuell noch geschützt, aber Sie können sie weiterhin überschreiben und Ihre eigene Implementierung bereitstellen, wie oben gezeigt.

Wenn Sie eine dieser überschreibbaren Methoden in C++/WinRT überschreiben, muss Ihre runtimeclass IDL die Methode nicht deklarieren. Weitere Informationen über die angezeigte base_type-Syntax finden Sie im nächsten Abschnitt dieses Themas (Aufrufen des Basistyps).

IDL

namespace Example
{
    runtimeclass CustomVSM : Microsoft.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::Microsoft::UI::Xaml::Controls::Control const& control, winrt::Microsoft::UI::Xaml::FrameworkElement const& templateRoot, winrt::hstring const& stateName, winrt::Microsoft::UI::Xaml::VisualStateGroup const& group, winrt::Microsoft::UI::Xaml::VisualState const& state, bool useTransitions) {
            return base_type::GoToStateCore(control, templateRoot, stateName, group, state, useTransitions);
        }
    };
}

Aufruf Ihres Basistyps

Sie können auf Ihren Basistyp zugreifen und Methoden darauf aufrufen, indem Sie den Typalias base_typeverwenden. 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 . Im Folgenden finden Sie ein Beispiel:

struct MyDerivedRuntimeClass : MyDerivedRuntimeClassT<MyDerivedRuntimeClass>
{
    ...

    void Foo()
    {
        // Call my base type's Bar method.
        base_type::Bar();
    }
};

Wichtige APIs