0

Panel(特に自作の)に表示したいツリーまたはメニューのようなデータ構造がありますPolarPanelが、すべての項目は同じパネルの VisualChildren である必要があります。

を定義する場合HierarchicalDataTemplate、 を作成しItemsControlsて として指定する必要がありますIsItemsHostか、それともここで間違っていますか? 親の ItemsHost を何らかの方法で参照できますか?

    <HierarchicalDataTemplate
        DataType="{x:Type local:ItemsCollection}"
        ItemsSource="{Binding Children}"
        >
        <!--/* "virtual" ItemsHost referencing the parent's ItemsHost? */-->
    </HierarchicalDataTemplate>

(私の最初の回避策はGetAllTheChildren、SelectedChild のすべての子とすべての子を再帰的に返すプロパティをルート ノードに配置することでした。これは ObservableCollection とは簡単に連携しませんGetAllTheChildren。必要以上のアイテムをリロードします)。

アイテムのビューを作成して同じ親に描画することにより、コード ビハインドでそれを実行できることはわかっていますが、WPF の間接的な自動魔法の方法を探しています。

編集:私は現在、すべてItemControls / Panelsが互いの上に描画される改善された回避策を使用しています。これにより、階層的な側面が保持されるため、上記 (GetAllTheChildren を使用) よりもはるかに優れたソリューションになります。しかし、それはまだ私の質問に答えていません...

グラフィカルに表示すると、次のよう になります。階層要素を同じスペースに配置する必要があることに注意してください。
PolarMenu の例

これに対するクリーンでシンプルな解決策はありますか?

4

1 に答える 1

0

グラフィックの結果が非常に魅力的であることは認めざるを得ません。

あなたの質問に答えるために、ホストと同じパネルを共有しようとしたことはありませんが、可能ではないと思います. これは、ビジュアル ツリー階層スキーマを壊します。どのビジュアル要素も、複数の親を持つことはできません。

すべての階層レベルが独自のリングをマッピングすると仮定すると、このような複合 UI を作成する古典的な方法に間違いなく賭けることになります。HierarchicalTemplates と ItemsControls を使用することの便利さについて疑いの余地はありませんが、複雑なタスクになる可能性があります。

さらに、あなたの目標が、通常のツリービューのようなある種の崩壊をもたらすことであるかどうかはわかりません。この場合、従来の WPF アプローチを回避するのは悪夢です!

私の解決策は、カスタムパネルを作成して、子供をリングに配置できるようにすることです。

それがすべてではありません。カスタム コントロールと ItemsControl の両方を作成する必要があります。最初のものは、レンダリングする必要があるリング スライスを表し、もう 1 つはジェネレーターとして表します。アイテム ホルダーとして機能するコントロールには、角度と半径の 2 つのプロパティがあります。厚みはバラバラに設定できます。

MeasureOverride を呼び出すパネルは、リングのネストを考慮し、それに応じて子の角度と半径の両方を設定する必要があります。

私の観点からは、保持コントロールは ContentControl から派生する必要があります。これは、スライスの形状をレンダリングする必要があり、そのタスクはこのコントロールによって実行される必要があるためです。特定の埋め込みコントロール (テキスト、ボタンなど) をコンテンツとして内部に配置できます。

もちろん、それはすべてブレインストーミングです。それが最善の解決策であることを保証するものではなく、そのままで機能するわけでもありません。

それが役に立てば幸い。

乾杯

于 2011-07-26T11:55:48.723 に答える