13

これは私を困惑させました。ItemHostとしてカスタムコンテナとカスタムパネルの両方を使用するカスタムItemsControlがあります。これで、パネルには、コンテナがレンダリングの目的で必要とするいくつかのメトリックがあります。それらはビジュアルツリーのパネルの直接の子であるため、コンテナのParentプロパティはパネルを返すと思いますが、そうではありません。

また、標準のListBoxでSnoopを使用してこの正確なことを確認したので、これはコードに限定されませんが、ItemsControlsのすべてのコンテナーに限定されないようです。

これで、VisualTreeHelperを使用して視覚的な親(必要なもの)を取得できることがわかりましたが、親がパネルにならないのはなぜですか?

パネルが単にビジュアルツリーの一部であり、親が論理ツリー用に予約されているという議論の場合、親はItemsControlではないでしょうか。

コンテナもあるという引数がItemsControlのビジュアルツリーの一部であり、論理ツリーではない場合、コンテナでホストされているコンテンツがコンテナを親プロパティとして返すのはなぜですか?

つまり、データアイテムから論理ツリーをたどっている場合は、コンテナに立ち寄ります。これは、コンテナからパネルへのバインディングが期待どおりに機能しない理由を説明している可能性があります。(バインディングは視覚的な階層ではなく論理的な階層に基づいていると思いますが、確認するためにテストする必要があります。)

4

2 に答える 2

8

私はそれに気づかなかったし、これが私の好奇心を刺激した。.Net Frameworkで手がかりを探したところ、Parentプロパティは実際に手動で設定されているようです。これにはいくつかの手順が必要でしたが、親プロパティを変更する唯一の方法は次のメソッドを呼び出すことです。

親の愛情

たとえば、FrameworkElement.AddLogicalChildメソッドを分析すると、次のメソッドがそれを使用していることがわかりました。

FrameworkElement.AddLogicalChild分析

これにより、親プロパティが論理ツリーを参照することになっていることが確認されます。独自のカスタムコントロールを作成しようとしました。

[ContentProperty("CustomContent")]
public class CustomControl1 : Control
{
    static CustomControl1()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl1), new FrameworkPropertyMetadata(typeof(CustomControl1)));
    }

    public object CustomContent
    {
        get { return GetValue(CustomContentProperty); }
        set { SetValue(CustomContentProperty, value); }
    }

    public static readonly DependencyProperty CustomContentProperty = DependencyProperty.Register("CustomContent", typeof(object), typeof(CustomControl1));
}

このテンプレートを使用して:

<ControlTemplate TargetType="{x:Type local:CustomControl1}">
     <ContentPresenter ContentSource="CustomContent" />
</ControlTemplate>

私はそれをこのように使用しました:

<WpfApplication1:CustomControl1 Width="50" Height="50">
    <Rectangle Fill="Red" />
</WpfApplication1:CustomControl1>

...これはこのように機能しました(魅力のように:-)):

カスタムコントロール画面caprute

...そして何を推測しますか...長方形の親が設定されていません:-)

今のところ調査を続ける時間はありませんが、ItemsControlに関しては、ItemContainerGeneratorがitemsContainersを挿入する論理的な親を知らない可能性があるため、この場合に親プロパティが設定されない理由を説明できます...しかしそれは証明される必要があります...

于 2013-02-20T09:22:25.383 に答える
4

FrameworkElement.Parentプロパティのドキュメントには、たとえばデータテンプレートで作成されたアイテムの場合はnullになる可能性があると記載されています。そのような場合、彼らは以下を使用することを提案しFrameworkElement.TemplatedParentます:

テンプレートの場合、テンプレートの親は最終的にnullになります。このポイントを超えて、テンプレートが実際に適用される論理ツリーに拡張するには、TemplatedParentを使用します。

それはあなたの場合かもしれませんか?それは同様のケースで私を助けました(フォールバックとしてParent使用されるnullの場合はそれを使用しました)。TemplateParent

はい、答えは遅いですが、それは私と同じエラーにつまずく他の人を助けるかもしれません

于 2018-05-03T16:19:51.883 に答える