使用C++/WinRT编写XAML自定义控件时哪些内容需定义在IDL中
C++/WinRT 自定义XAML控件IDL规则解答
核心前提
IDL(接口定义语言)的作用是描述WinRT运行时类的公共对外接口,编译器会基于IDL生成WinRT元数据和对应投影代码,XAML解析器仅能识别元数据中暴露的成员。
问题逐一解答
什么情况下XAML调用的内容需要定义在IDL中?
只有需要在控件外部的XAML中使用、或是需要依赖WinRT绑定机制(如{Binding}、{x:Bind}绑定外部数据源、作为公共属性供其他控件赋值)的成员,才需要在IDL中声明。
所有属性都需要添加到IDL吗?还是仅依赖属性需要?
- 只要是需要作为控件公共能力对外暴露,允许外部XAML赋值、绑定的属性,不管是不是依赖属性,都需要写入IDL。
- 控件内部自用的私有属性不需要写入IDL。
- 注意:依赖属性的标识符静态字段(如
MyPropertyProperty)不需要写入IDL,仅需把依赖属性对应的存取器声明写入IDL即可。
函数是否需要出现在IDL中?
和属性的规则完全一致:需要对外暴露给外部调用、或是需要在外部XAML中通过{x:Bind}绑定的公共函数,才需要写入IDL;控件内部自用的函数不需要。
为什么模板生成的MyProperty需要在IDL定义,而ClickHandler不需要?
二者的设计定位完全不同:
MyProperty是控件的公共属性,设计目的是供控件的使用者在外部XAML中赋值、绑定,所以必须写入IDL暴露到WinRT元数据,XAML解析器才能识别这个属性。- 模板生成的
ClickHandler是控件内部的事件处理函数,仅用于MyControl.xaml中控件自身元素的事件绑定,属于实现层面的内部逻辑,不需要对外暴露,因此不需要写入IDL。
补充:如果你自己实现的函数需要供外部XAML绑定使用(比如作为命令执行函数给外部
{x:Bind}绑定),还是需要写入IDL暴露。
内容的提问来源于stack exchange,提问作者citelao
相关产品推荐
相关产品推荐

