未找到自定义附加属性

时间:2015-03-16 18:03:02

标签: xaml c++-cx

我想为pivot元素实现一个新属性(名为“MenuForeground”),以便通过定义的ControlTemplate更改PivotItem头的颜色。

因此,我为自定义属性创建了一个新类,在所需的代码隐藏xaml.h文件中添加了#include,并根据自定义属性的命名空间定义了一个新的命名空间(“xamlns:cap”)。 / p>

PivotProperties.h

#pragma once
using namespace Windows::UI::Xaml;
namespace CustomAttachedProperties
{
public ref class PivotProperties sealed : Windows::UI::Xaml::DependencyObject
{
public:
    static Windows::UI::Color GetMenuForeground(UIElement^ obj);
    static void SetMenuForeground(UIElement^ obj, Windows::UI::Color value);

    static property DependencyProperty^ MenuForegroundProperty
    {
        DependencyProperty^ get() { return _menuForegroundProperty; }
    }

    private:
        static DependencyProperty^ _menuForegroundProperty;
    };
}

PivotProperties.cpp

#include "pch.h"
#include "PivotProperties.h"

using namespace CustomAttachedProperties;

DependencyProperty^ PivotProperties::_menuForegroundProperty = DependencyProperty::RegisterAttached(
"MenuForeground",
Windows::UI::Color::typeid,
Windows::UI::Xaml::Controls::Pivot::typeid,
ref new PropertyMetadata(false));

Windows::UI::Color PivotProperties::GetMenuForeground(UIElement^ obj)
{
    return (Windows::UI::Color)obj->GetValue(_menuForegroundProperty);
}

void PivotProperties::SetMenuForeground(UIElement^ obj, Windows::UI::Color value)
{
    obj->SetValue(_menuForegroundProperty, value);
}

为了将新属性用于pivot元素,我在root元素中声明了一个新的xml命名空间,如下所示

<Page
    // ...
    xmlns:cap="clr-namespace:CustomAttachedProperties">

但如果我尝试使用新属性......

<Pivot x:Name="pivot" cap:PivotProperties.MenuForeground="Red">...</Pivot>

...弹出一个错误,说:“在'PivotProperties'类型中找不到可附加属性'MenuForeground'。

如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

RegisterAttached方法的第三个参数ownerType必须为

  

注册依赖项属性的所有者类型

不是要设置属性的对象的类型。

所以你的声明应该是这样的:

DependencyProperty^ PivotProperties::_menuForegroundProperty =
    DependencyProperty::RegisterAttached(
        "MenuForeground",
        Windows::UI::Color::typeid,
        PivotProperties::typeid, // here
        ref new PropertyMetadata(false));

请注意,PivotProperties类不必从DependencyObject派生,只要它只声明附加属性。

您还可以考虑使用Windows.UI.Xaml.Media.Brush作为属性类型,使其符合BackgroundForeground等其他属性。