在XAML中设置自定义附加属性(引用类型)

时间:2013-11-01 17:49:05

标签: c# wpf xaml attached-properties

上下文:我正在实现一个将行为附加到对象*的系统。它在代码中按预期工作,但在XAML中不起作用。

* 是的,我知道Microsoft.Expression.Interactivity.dll

简而言之,我希望能够做到这一点。

<Rectangle>
    <m:BehaviorExtensions.Behavior>
        <m:HoverBehavior />
    </m:BehaviorExtensions.Behavior>
</Rectangle>

..但似乎只能做到这一点:

<Window.Resources>
    <m:HoverBehavior x:Key="Hover" />
</Window.Resources>

<Rectangle m:BehaviorExtensions.Behavior="{DynamicResource Hover}" />

m:BehaviorExtensions当我尝试用嵌套标签标记它时,甚至不会[甚至]显示在Intellisense中。我在这里缺少什么?

这是定义附加属性的代码:

public static class BehaviorExtensions
{
    public static readonly DependencyProperty BehaviorProperty = DependencyProperty.RegisterAttached("Behavior", typeof(IBehavior), typeof(BehaviorExtensions), new FrameworkPropertyMetadata(null, BehaviorChangedCallback));

    public static void SetBehavior(UIElement element, IBehavior behavior)
    {
        if (element == null) { throw new ArgumentNullException("element"); }
        element.SetValue(BehaviorProperty, behavior);
    }

    public static IBehavior GetBehavior(UIElement element)
    {
        if (element == null) { throw new ArgumentNullException("element"); }
        return (IBehavior)element.GetValue(BehaviorProperty);
    }

    private static void BehaviorChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        IBehavior behavior;
        if (e.OldValue != null)
        {
            behavior = (IBehavior)e.OldValue;
            behavior.DetachFrom((UIElement)d);
        }
        if (e.NewValue == null) return;
        behavior = (IBehavior)e.NewValue;
        behavior.AttachTo((UIElement)d);
    }
}

编辑 - 经验教训:

事实证明这很好用。这是Intellisense需要与程序(字面意思)。当我完全忽略它而只是键入我想要的东西时,事情就会出现 - 即编译时没有打嗝。对于XAML而言,对Intellisense的尊重显然是医生所要求的。

0 个答案:

没有答案