windows C++-winrt的一些技巧

 实现 MeasureOverride 和 OnApplyTemplate 等可重写的方法

应用程序可以插入 XAML 中的一些扩展点,例如:

  • MeasureOverride
  • OnApplyTemplate
  • GoToStateCore

可以从 Control 运行时类派生自定义控件,而该运行时类本身派生自基本运行时类。 以下是一些可在派生类中替代的 Control、FrameworkElement 和 UIElement 的 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 { ... };
...
};

可重写方法在不同语言投影中呈现出不同形式。 例如,在 C# 中可重写方法通常呈现为受保护的虚拟方法。 在 C++/WinRT 中,它们既不是虚拟的也不是受保护的,但你仍可以覆盖它们并提供你自己的实现,如上所示。

如果要在 C++/WinRT 中重写这些可重写方法之一,则 runtimeclass IDL 不得声明该方法。

namespace Example
{
    runtimeclass CustomVSM : Windows.UI.Xaml.VisualStateManager
    {
        CustomVSM();
        // note that we don't declare GoToStateCore here
    }
}
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();
    }
};
C++/WinRT 命名约定 

C++/WinRT 建立了以下命名约定:

  • winrt::impl 命名空间保留供 C++/WinRT 使用,不应在应用程序中使用它;
  • 在 winrt 命名空间中,以小写字母开头的名称属于 C++/WinRT,不过可以在应用程序中使用它们。 文档会调用可以重载或专用化的名称。 例如,允许应用程序专用化 winrt::is_guid_of 函数模板;
  • 在 winrt 命名空间的子命名空间中(winrt::impl 除外),以大写字母开头的名称可供应用程序使用 ;
  • 在所有命名空间中,以 WINRT_IMPL_ 开头的名称都保留供 C++/WinRT 使用,因此不应在应用程序中使用它们;
  • 在所有命名空间中,以 WINRT_ 开头的名称(以 WINRT_IMPL_ 开头的名称除外)保留供 C++/WinRT 使用 。 你可以使用它们,文档会调用应用程序可以定义的名称,例如 WINRT_LEAN_AND_MEAN;

应用程序通常会执行命名空间组合,将 winrt 根命名空间的子命名空间导入 winrt 根命名空间中 :

struct MyDerivedRuntimeClass : MyDerivedRuntimeClassT<MyDerivedRuntimeClass>
{
    ...

    void Foo()
    {
        // Call my base type's Bar method.
        base_type::Bar();
    }
};
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值