4

AssociatedObject の Clip プロパティを変更する動作を開発しました。アプリケーションを実行すると、すべて問題ありません。しかし、Blend でページを表示すると、動作が関連オブジェクトに影響を与えていないように見えます。

Visual Studio 2010 デバッガーをプロセスにアタッチしてブレンドを「デバッグ」し、動作の OnAttached メソッドにブレーク ポイントを設定しようとしましたが、ブレークポイントに到達しません。あたかもブレンドが、設計時にその動作がアタッチされるのを防ぐかのように。

それを回避する方法はありますか?

乾杯、

4

2 に答える 2

2

私はついにそれを回避する実行可能な方法を見つけましたが、この回答の最後に大きな警告があります。これが私の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 が使用する添付プロパティでは機能しないため、使用できません。

この問題に対する回答が見つかった場合は、この回答を更新します。

于 2012-06-18T15:24:15.753 に答える
0

よくわかりませんが、関連付けられたオブジェクトは、動作が「アタッチ」された場合にのみ影響を受けると思います。これは「OnAttached」イベント中に呼び出されますが、このイベントが設計時に呼び出されるとは思いません。私の知る限り、コントロールの設計時の変更は、初期化/作成段階で発生します。OnAttached は、これらすべてが発生した後に発生するため (AssociatedObject を操作できる理由)、その結果、動作が設計時にコントロールを変更することが困難になります。不可能だと言っているわけではありませんが、コントロールの有効期間と動作の明らかな設計から、このアプローチは難しいように思えます。ソリューション:

  • テンプレート操作のアプローチを取ります。求める印象を生み出す方法で設計したカスタム スタイルまたはリソース ディクショナリ キーを添付します。
  • 別のコントロールをバインドできるプロパティを公開するカスタム コントロールを Visual Studio で作成します。このカスタム コントロールがこの「プロパティ」を操作できるようにします。つまり、初期化メソッドのいずれかでクリップ プロパティを使用してコントロールを操作します。たとえば、InitializeComponent 中に、コンテンツがロードされているかどうかを確認してから、必要に応じて「Clip」プロパティを調整するメソッドを呼び出します。Silverlight コントロールのライフサイクルを読んでください。 -コントロール/

私が言ったように、ここでの答えはわかりませんが、これだけは言います - 解決策が複雑すぎると思われる場合は、おそらくよりクリーンなアプローチがあります;)

于 2012-04-15T12:00:42.013 に答える