私はついにそれを回避する実行可能な方法を見つけましたが、この回答の最後に大きな警告があります。これが私の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
}
これを使用して、次のようなビヘイビアーをアタッチできます。
<my:CustomAttachManager.Attached>
<my:RedBackgroundBehavior></my:RedBackgroundBehavior>
</my:CustomAttachManager.Attached>
私の動作例では、パネルの背景が赤に変わり、デザイナーに表示されます。
残りの問題は、複数の動作の場合です。私が思いつく最善の解決策はプロキシです:
[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();
}
}
次のように使用できます。
<my:CustomAttachManager.Attached>
<my:MultipleBehavior>
<my:RedBackgroundBehavior />
<my:SupriseBehavior />
</my:MultipleBehavior>
</my:CustomAttachManager.Attached>
プロキシには、何かが既にアタッチされた後に追加された動作を適切に処理できないという欠陥がありますが、従来のユース ケースでは発生しません。
注意点は、Blend がオブジェクト ツリーにビヘイビアを表示する方法がわからないことです。「AlternateContentProperty」は、CustomAttachManager が使用する添付プロパティでは機能しないため、使用できません。
この問題に対する回答が見つかった場合は、この回答を更新します。