0

キャンバス上にカスタム コントロールを含むカスタム ウィンドウを持つ WPF アプリケーションがあります (カスタム ウィンドウを含むメイン キャンバスは、再びカスタム コントロールを表示します)。したがって、基本的にビジュアル ツリーは次のようになります (暗黙的な境界線やその他のものは除きます)。

- Windows
  - Canvas
    - WindowMgr
      - CustomWindow (maximized with z-index 0, functioning as background)
        - ScrollPresenter
          - CustomControl1
      - CustomWindow
        - ScrollPresenter
          - CustomControl2

ここで、これらのカスタム コントロールを相互にドラッグ アンド ドロップする必要があります (通常は、移動可能なウィンドウからバックグラウンド ウィンドウへ)。ドラッグ アンド ドロップの装飾を表示するには、装飾された要素と装飾レイヤーが必要です。通常、例ではそのために grid または itemscontrol を使用し、同じ要素から adorner レイヤーも取得します。

ScrollPreseneter/CustomWindows がコンテンツをクリップしてウィンドウの外にドラッグできないため、ここで同じことを行っても機能しません。今のところ、ルート キャンバスが見つかるまでビジュアル ツリーをたどり、それを装飾された要素として使用しますが、それはちょっと汚れているように見えます (そして、私たちが経験したように、あまり堅牢ではありません)。

これに対する堅牢なソリューションに関する提案はありますか?

4

1 に答える 1

1

私があなたの質問を正しく読み、あなた自身がそれについて言及しなかったので、あなたはビジュアルツリーのその下の要素のための装飾層を提供するAdornerDecorator Classを探しているかもしれません。

ScrollPresenterから派生した名前から仮定すると、ContentPresenter高度なカスタムコントロールを実装する場合は、そのようにそれらContentPresenterを囲むことができます。たとえば、ドラッグアンドドロップを含む実際の作業シナリオについては、AdornerDecoratorを忘れないでください。AdornerDecoratorWindow Class

つまり、を使用して、カスタムコントロール内にAdornerDecorator必要なものが含まれていることを確認します。したがって、ビジュアルツリーを上に移動して、他の場所でそれを取得する必要がなくなります。AdornerLayer

 <ControlTemplate TargetType="{x:Type CustomWindow}">
     <Border ...>
         <Grid>
             <AdornerDecorator>
                 <ScrollPresenter ... />
             </AdornerDecorator>
         </Grid>
     </Border>
 </ControlTemplate>

特定のシナリオに応じてAdornerDecorator、カスタムウィンドウ、カスタムコントロール、またはその両方が必要になる場合があります。

アドナーアーキテクチャの詳細については、アドナーの概要を参照してください。

于 2009-09-08T17:43:29.483 に答える