Share via


使用 C++/WinRT 呼叫和覆寫您的基底類型

重要

如需一些基本概念和詞彙,以協助了解如何以 C++/WinRT 使用及撰寫執行階段類別,請參閱使用 C++/WinRT 來使用 API使用 C++/WinRT 撰寫 API

實作 overridable 方法,例如MeasureOverrideOnApplyTemplate

XAML 中有一些擴充點可供您的應用程式插入, 例如:

您可以從控制項執行階段類別衍生自訂控制項,該類別本身則是衍生自基底執行階段類別。 ControlFrameworkElementUIElement 也有一些 overridable 方法,您可以在衍生類別中覆寫。 以下程式碼範例會示範如何進行。

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

Overridable 方法本身在不同的語言投影中有不同的形態。 例如, 在 C# 中, 可覆寫的方法通常會顯示為受保護的虛擬方法。 在C++/WinRT 中,這些並非虛擬,也不受保護,但仍然可以予以覆寫並提供您自己的實作,如上所示。

如果您要在 C++/WinRT 中覆寫其中一個可覆寫的方法,則您的 runtimeclass IDL 不得宣告方法。 如需所顯示 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