Compartir a través de


Llamar e invalidar el tipo base con C++/WinRT

Importante

Para conocer los conceptos y términos esenciales que te ayuden a entender cómo consumir y crear clases en tiempo de ejecución con C++/WinRT, consulta Consumir API con C++/WinRT y Crear API con C++/WinRT .

Implementación de métodos reemplazables, como MeasureOverride y OnApplyTemplate

Hay algunos puntos de extensión en XAML a los que la aplicación se puede conectar, por ejemplo:

Un control personalizado se deriva de la clase de tiempo de ejecución {Control, que a su vez se deriva de las clases base de tiempo de ejecución. Además, hay métodos overridable de Control, FrameworkElement y UIElement que se pueden reemplazar en la clase derivada. Este es un ejemplo de código que muestra cómo hacerlo.

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 { ... };
...
};

Los métodos reemplazables se presentan de forma diferente en las distintas proyecciones de lenguaje. En C#, por ejemplo, los métodos reemplazables suelen aparecen como métodos virtuales protegidos. En C++/WinRT, no son ni virtuales ni protegidas, pero aun así puedes reemplazarlas y proporcionar tu propia implementación, tal y como se indicó anteriormente.

Si se va a reemplazar uno de estos métodos reemplazables en C++ o WinRT, el IDL de runtimeclass no debe declarar el método. Para obtener más información sobre la sintaxis base_type que se muestra, consulte la sección siguiente de este tema (Llamada al tipo base).

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);
        }
    };
}

Llamada al tipo base

Puede acceder al tipo base y llamar a métodos del mismo mediante el alias de tipo base_type. Hemos visto un ejemplo de esto en la sección anterior; pero puede usar base_type para tener acceso a cualquier miembro de clase base (no solo métodos invalidados). Este es un ejemplo:

struct MyDerivedRuntimeClass : MyDerivedRuntimeClassT<MyDerivedRuntimeClass>
{
    ...

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

API importantes