在C++/WinRT中实现WinUI3/UWP自定义DependencyProperty的最简要求
C++/WinRT 自定义DependencyProperty最简示例
以下是实现UWP/WinUI自定义控件依赖属性的最少代码,对应XAML <local:MyControl Foo="Bar" /> 的使用场景:
1. 控件头文件(MyControl.h)
#pragma once #include <winrt/Windows.UI.Xaml.h> #include <winrt/Windows.UI.Xaml.Controls.h> namespace winrt::MyApp::implementation { struct MyControl : MyControlT<MyControl> { MyControl() = default; // 静态依赖属性实例 static Windows::UI::Xaml::DependencyProperty FooProperty(); // 属性的getter/setter winrt::hstring Foo(); void Foo(winrt::hstring const& value); }; } namespace winrt::MyApp::factory_implementation { struct MyControl : MyControlT<MyControl, implementation::MyControl> { }; }
2. 控件实现文件(MyControl.cpp)
#include "pch.h" #include "MyControl.h" namespace winrt::MyApp::implementation { // 注册依赖属性 Windows::UI::Xaml::DependencyProperty MyControl::FooProperty() { static const auto property = Windows::UI::Xaml::DependencyProperty::Register( L"Foo", // 属性名称,需与XAML中使用的名称完全一致 xaml_typename<hstring>(),// 属性的数据类型 xaml_typename<MyApp::MyControl>(), // 所属控件类型 PropertyMetadata{ box_value(L"") } // 属性默认值 ); return property; } // 获取属性值 winrt::hstring MyControl::Foo() { return unbox_value<hstring>(GetValue(FooProperty())); } // 设置属性值 void MyControl::Foo(winrt::hstring const& value) { SetValue(FooProperty(), box_value(value)); } }
关键说明
- 静态的
FooProperty是核心,通过Register方法完成依赖属性的注册,这是XAML能识别该属性的基础。 - getter/setter内部调用
GetValue和SetValue,这是依赖属性的标准访问方式,而非直接操作成员变量。 - XAML中需确保命名空间映射正确,例如:
xmlns:local="using:MyApp",之后即可用<local:MyControl Foo="Bar" />赋值。
内容的提问来源于stack exchange,提问作者citelao
相关产品推荐
相关产品推荐

