2009-06-18 22 views
0

キャンバスにカスタムウィンドウを持ち、カスタムコントロールを含むWPFアプリケーションがあります(カスタムウィンドウを含むメインキャンバスは再びカスタムコントロールを表示します)。だから、基本的にビジュアルツリーは、(暗黙の国境や他のものなし)次のようになります。深くネストされたビジュアルツリーのドラッグアンドドロップアドバンテージ

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

は、今、私たちは(バックグラウンドウィンドウに可動窓から通常は)お互いにそれらのカスタムコントロールから&ドロップをドラッグする必要があります。ドラッグを表示するには&ドロップadornerと飾られた要素とadorner層が必要です。通常、例ではグリッドまたはitemscontrolを使用し、同じ要素からadornerレイヤーを取得します。

ここでは、ScrollPreseneter/CustomWindowsがウィンドウの外にドラッグできないように内容をクリップするため、これを行うことはできません。現時点では、ルートキャンバスを見つけてそれを装飾要素として使用するまで、ビジュアルツリーを歩いていますが、それは一種の汚れています(経験したように、あまり堅牢ではありません)。

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

答えて

1

私が正しくあなたの質問を読んで、あなたはそれを自分で言及していないので、あなたはは、ビジュアルツリーで、その下の要素のadorner層を提供AdornerDecorator Class、探しているかもしれない場合。 ScrollPresenterContentPresenterから派生していること、その名前から想定すると

は、それがWindow Classは、素敵な実際の作業のための一例Don’t forget the AdornerDecoratorを参照ん同じように、高度なカスタムコントロールを実現するために、あなたがAdornerDecoratorによって彼らのContentPresenterを囲むようにしたいかもしれないことは注目に値しますドラッグを伴うシナリオ&もドロップされます。

<ControlTemplate TargetType="{x:Type CustomWindow}"> 
    <Border ...> 
     <Grid> 
      <AdornerDecorator> 
       <ScrollPresenter ... /> 
      </AdornerDecorator> 
     </Grid> 
    </Border> 
</ControlTemplate> 
:、 AdornerDecoratorによってあなたが例えば、それ故にビジュアルツリーを歩いて別の場所でそれを取得する必要がなくなり、カスタムコントロール内に含まれる必要 AdornerLayerを確保するよさ

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

adornerアーキテクチャの詳細については、Adorners Overviewを参照してください。

関連する問題