2011-12-15 15 views
0

図で動作するように設計されたグラフィックスWPFエディタがあります。ダイアグラムは非常に多数のオブジェクトで構成できるため、出力用にDrawingsを使用するように選択されています。WPFでのグラフィックオブジェクトのビジュアル編集

public List<Visual> BuildVisuals(List<BusinessObject> objectsList) 
{ 
    // foreach item in objectsList takes item.MyDrawing and draws it with DrawingContext 
} 

、その後

public class VisualHost : FrameworkElement 
{ 
    // FrameworkElement overrides, skipped 

    public readonly VisualCollection _children;  

    public VisualHost(List<Visual> visualsList) 
    { 
    _children = new VisualCollection(this); 
    foreach(var visual in visualsList) 
    { 
     _children.Add(visual); 
    } 
    // mouse handlers, other logic (skipped) 
    } 
} 

すべてのホストを描くに受信したデータを挿入:それは私たちはいくつかのビジネスのリストは、各描画のためのDrawingVisualを作成し、ヘルパーに

class BusinessObject 
{ 
    // bunch of other properties and methods 
    public GeometryDrawing MyDrawing {get;set;} 
} 

パス、それをオブジェクトの作成を意味し(双方向データがオンザフライで変化するそれぞれのビジネスオブジェクトへの後方マッピングでVisualHitTestingさえも)うまく動作しますが、今ではビジュアルオブジェクトの編集 - ワークスペースの移動、サイズの変更、比率の変更などWPF Thumbs and Adorners(http://www.codeproject.com/KB/WPF/WPFDiagramDesigner_Part1.aspx)私たちのビジュアルがそうでないことをUIElement/Controlsと共に示します。初期のロジックをあまり変更することなく誰もこの問題を解決する方法を見ていますか?いくつかの回避策や類似の機能があります。上記のコードの書き換えはオプションではありません。ダイアグラム上で使用する場合、メモリ内に1000以上のControlオブジェクトを持つことはできません。前もって感謝します。

+0

FrameworkElementがマウスフォーカスを受け取ったときにUIElementまたはControlでラップし、失われたときにFrameworkElement ..に戻るような最適化を作成します。 –

+0

それについて考えてみましょう。しかし、FE自体をラップすることは何もしません。なぜなら、私は子供たちを飾る必要があるからです。 – Jaded

+0

したがって、単一の 'MultiDrawingVisualHost'または多くの' MultiDrawingVisualHost'を持つコンテナ(たとえばWindow)がありますか?または、 'MultiDrawingVisualHost'が唯一のホストであり、1000のオブジェクトを持っていますか?問題を少し良く定義してください。 –

答えて

0

問題は手動で解決されました。サイズ変更と回転アドルナは、既存のものとは別のオブジェクトとして描画され、設定/フォーカスが失われた状態でキャンバスに追加/削除されました。

関連する問題