다음을 통해 공유


C++/WinRT를 사용하여 기본 형식 호출 및 재정의

Important

C++/WinRT를 사용해 런타임 클래스를 사용하거나 작성하는 방법을 더욱 쉽게 이해할 수 있는 필수 개념과 용어에 대해서는 C++/WinRT를 통한 API 사용C++/WinRT를 통한 API 작성을 참조하세요.

재정의 가능 메서드(예: MeasureOverrideOnApplyTemplate) 구현

XAML에는 애플리케이션이 연결할 수 있는 몇 가지 확장 지점이 있습니다. 예를 들면 다음과 같습니다.

기본 런타임 클래스에서 추가로 파생된 Control 런타임 클래스에서 사용자 지정 컨트롤을 파생시킵니다. 그리고 파생 클래스에서 재정의할 수 있는 Control, FrameworkElementUIElementoverridable 메서드가 있습니다. 작업을 수행하는 방법을 보여 주는 코드 예제는 다음과 같습니다.

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에서 이러한 재정의 가능한 메서드 중 하나를 재정의하는 경우 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