You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 10:55:22