Прочитать на английском

Поделиться через


Вызов и переопределение базового типа с помощью C++/WinRT

Важно!

Основные понятия и термины, которые помогают понять, как использовать и создавать классы среды выполнения с помощью C++/WinRT, см. в разделах Использование API-интерфейсов в C++/WinRTи Создание API-интерфейсов в C++/WinRT.

Реализация переопределяемых методов, например MeasureOverride и OnApplyTemplate

Существует несколько точек расширения в XAML, к которым может подключаться приложение, например следующие:

Вы получаете пользовательский элемент управления из класса среды выполнения элемента управления, который в дальнейшем сам является производным от классов базовой среды выполнения. Существуют также переопределяемые методы Control, FrameworkElement и UIElement, которые можно переопределить в производном классе. Этот пример кода демонстрирует, как это сделать.

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

Переопределяемые методы в разных языковых проекциях представляются по-разному. В C#, например, переопределяемые методы обычно отображаются как защищенные виртуальные методы. В C++/WinRT они не являются ни виртуальными, ни защищенными, но их по-прежнему можно переопределить и предоставить собственную реализацию, как показано выше.

Если вы переопределяете один из таких переопределяемых методов в C++/WinRT, ваш IDL runtimeclass не должен объявлять метод. Дополнительные сведения о синтаксисе, показанном base_type в следующем разделе этой статьи (вызов базового типа).

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

Вызов базового типа

Вы можете получить доступ к базовому типу и вызвать методы с помощью псевдонима base_typeтипа. Мы видели пример этого в предыдущем разделе; но вы можете использовать base_type для доступа к любому члену базового класса (а не только переопределенным методам). Приведем пример:

struct MyDerivedRuntimeClass : MyDerivedRuntimeClassT<MyDerivedRuntimeClass>
{
    ...

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

Важные API