上下文:我正在实现一个将行为附加到对象*的系统。它在代码中按预期工作,但在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的尊重显然是医生所要求的。