1

所有する親要素によって定義された単一のプロパティであるAttachedPropertyを、その親のいくつかの子要素を介して複数の値で設定するにはどうすればよいですか?

例えば:

私が持っている場合:

<DockPanel>
  <CheckBox DockPanel.Dock="Top">Hello</CheckBox>
  <CheckBox DockPanel.Dock="Bottom">World</CheckBox>
</DockPanel>

ここでは、単一のDockPanel要素があり、単一のDockプロパティがあります。「上」と「下」を同時に設定するにはどうすればよいですか?

4

3 に答える 3

3

最終的には次のような方法になります

public class DockPanel : Panel
{
    public static readonly DependencyProperty DockProperty;
    // ...
    public static void SetDock(UIElement element, Dock dock)
    {
        element.SetValue(DockProperty, value);
    }
}

ご覧のとおり、実際には親に設定されていませんが、親インスタンスではなく、DockPanelの静的メソッドSetDockを介してCheckBox自体に設定されています。コードビハインドでこれを行うと、これが少し明確になります。DockPanelのインスタンスを使用しないことに注意してください。

DockPanel.SetDock(checkBox1, Dock.Top);
DockPanel.SetDock(checkBox2, Dock.Bottom);

うまくいけば、これが「内部で」どのように機能するかという質問でない限り、これが明確でした。その場合は、この質問を参照してください。

リンクからの引用。

このメカニズムの目的は、子オブジェクト自体ではなく、親オブジェクトに必要な情報を他のオブジェクトに「アタッチ」することです。

CheckBoxは、DockPanelにない限り、Dockプロパティを使用できません。Grid.Row、Canvas.Left、Validation.HasError(読み取り専用)などについても同じことが言えます。したがって、基本的に、DockPanelは情報を必要とするものですが、それを格納できるようにするには、すべての子が必要です。したがって、添付プロパティを使用しています。PuneetPanelという新しいパネルを作成し、子の位置を計算するためにAngelが必要な場合は、このパネル内に独自の添付プロパティPuneetPanel.Angelを定義でき、すべての子がサブクラス化せずにこれを使用できます。

于 2010-11-08T07:04:45.420 に答える
0

これはとてもいい質問です。答えは、AttchedPropertyがどのように機能するかにあります。AttachedPropertyは、子をレンダリングするために親によって使用されます。子をレンダリングする前に、親は子に定義されているアタッチされたプロパティを探し、子に適用します。

私はあなたに役立つかもしれないmsdnからこれを見つけました::

DockPanelはDockPanel.Dockアタッチされたプロパティを定義し、DockPanelにはレンダリングロジックの一部としてクラスレベルのコードがあります(具体的には、MeasureOverrideとArrangeOverride)。
DockPanelインスタンスは、その直接の子要素のいずれかがDockPanel.Dockの値を設定しているかどうかを常に確認します。その場合、それらの値は、その特定の子要素に適用されるレンダリングロジックの入力になります。

詳細な概要を取得するには、このリンクを参照してください::
http://http://msdn.microsoft.com/en-us/library/ms749011.aspx

お役に立てば幸いです!!

于 2010-11-08T04:57:21.140 に答える
0

独自のカスタムアタッチプロパティの場合、探しているものを実現するための2つのオプションがあります。

1.設定可能な値の組み合わせの数が複雑でない場合は、FlagsAttributeが設定された列挙型の添付プロパティを作成できます。ビット単位を使用して設定する値を組み合わせることができます-または|

[Flags]
public enum MultiDock
{
  Left,
  Top,
  Right,
  Bottom
}

そしてコードでのその使用法:

MyCustomPanelOrWhatever.SetMultiDock(MultiDock.Left | MultiDock.Bottom);

これには小さな問題が1つありますが、xamlで上記を直接行うことはできません。文字列をフラグ付き列挙値に変換できる、 MarkupExtensionを作成する必要があります。その使用法は次のようになります。

<CheckBox src:MyCustomPanelOrWhatever.MulitDock="{src:FlaggedEnum Left|Bottom}"  />

2.アタッチされたプロパティは任意のタイプである可能性があるため、もちろん、複雑なタイプ(複数のサブプロパティを持つ)またはコレクションである可能性もあります。したがって、次のようなことを簡単に行うことができます。

MyCustomPanelOrWhatever.SetMultiDock(new List<MultiDock> { MultiDock.Left, MultiDock.Bottom });

アタッチされたプロパティをそのように定義した場合、xamlのコンバーターは必要なく、直接使用できます。

<CheckBox>
    <src:MyCustomPanelOrWhatever.MultiDock>
        <src:MultiDock.Left/>
        <src:MultiDock.Bottom/>
    </src:MyCustomPanelOrWhatever.MultiDock>
</CheckBox>
于 2010-11-08T08:08:44.510 に答える