Endlich habe ich einen brauchbaren Weg gefunden, aber es gibt einen großen Vorbehalt, den ich am Ende dieser Antwort stelle. Hier ist mein CustomAttachManager:
public class CustomAttachManager : DependencyObject
{
#region Object CustomAttachManager.Attached = null
public static IAttachedObject GetAttached(DependencyObject obj) { return (IAttachedObject)obj.GetValue(AttachedProperty); }
public static void SetAttached(DependencyObject obj, IAttachedObject value) { obj.SetValue(AttachedProperty, value); }
public static readonly DependencyProperty AttachedProperty =
DependencyProperty.RegisterAttached("Attached", typeof(IAttachedObject), typeof(CustomAttachManager), new PropertyMetadata(null, StaticHandleAttachedChanged));
static void StaticHandleAttachedChanged(DependencyObject self, DependencyPropertyChangedEventArgs args)
{
var ov = (IAttachedObject)args.OldValue;
var nv = (IAttachedObject)args.NewValue;
if (ov != null) ov.Detach();
if (nv != null) nv.Attach(self);
}
#endregion
}
Sie können es dann verwenden, um Verhaltensweisen wie diese anhängen:
<my:CustomAttachManager.Attached>
<my:RedBackgroundBehavior></my:RedBackgroundBehavior>
</my:CustomAttachManager.Attached>
Mein Beispiel Verhalten ändert den Hintergrund eines Panels zu rot, die im Designer sichtbar ist.
Das verbleibende Problem ist der Fall von mehreren Verhaltensweisen. Die beste Lösung, die ich kommen könnte bis ein Proxy:
[ContentProperty("Children")]
public class MultipleBehavior : Behavior<DependencyObject>
{
DependencyObjectCollection<IAttachedObject> children = new DependencyObjectCollection<IAttachedObject>();
public DependencyObjectCollection<IAttachedObject> Children { get { return children; } }
protected override void OnAttached()
{
foreach (var child in Children) child.Attach(AssociatedObject);
}
protected override void OnDetaching()
{
foreach (var child in Children) child.Detach();
}
}
, die auf diese Weise verwendet werden können:
<my:CustomAttachManager.Attached>
<my:MultipleBehavior>
<my:RedBackgroundBehavior />
<my:SupriseBehavior />
</my:MultipleBehavior>
</my:CustomAttachManager.Attached>
Der Proxy in einen Defekt hat, dass es nicht richtig Verhaltensweisen hinzugefügt, nachdem etwas behandelt bereits angeschlossen, aber das wird im klassischen Anwendungsfall nicht passieren.
Der Vorbehalt ist, dass ich keine Möglichkeit kenne, Blend die Verhaltensweisen im Objektbaum anzuzeigen.Die "AlternateContentProperty" kann nicht verwendet werden, da sie nicht für angefügte Eigenschaften funktioniert. Dies wird von CustomAttachManager verwendet.
Ich werde diese Antwort aktualisieren, wenn ich eine Antwort auf dieses Problem finde.
Soweit ich weiß, ist dieses Problem auch in WPF mit Visual Studio 2013 (die Blend in seinem Designer integriert hat). Ich komme zu Ihrem Problem, da ich in dieser Umgebung eine ähnliche Situation habe. – FrankyB