2013-09-30 12 views
5

Der Hintergrund für mein Problem ist, dass ich eine Reihe von Geometrien (riesige Menge, denken Karte über eine größere Fläche) verteilt auf mehrere wpf Geometrie Instanzen (ursprünglich waren sie PathGeometry, aber die Speichernutzung I zu reduzieren sie vorprozessieren und StreamGeometries während des Ladens erstellen). Nun möchte ich aus diesen Geometrien Kacheln erzeugen.Cropping eine beliebige wpf Geometrie

Grundsätzlich würde Ich mag ein größeres Geometrie Objekt nehmen und „ausgeschnitten“ ein Rechteck davon (meine Kachel), damit ich mehrere kleineren Geometrien zu bekommen. So etwas wie das Bild unten:

Slicing up a large geometry

Beachten Sie, dass ich das Ergebnis soll eine neue Geometrie sein, kein Rendering. Ich weiß, dass ich die visuelle Ergebnis erreichen kann, indem Sie eine clip to a UIElement oder pushing a clip to a drawingvisual anwenden.

Ich habe versucht, mit Geometry.Combine mit einem der Argumente das Clip-Rechteck, aber ich kann es nicht tun, was ich will (ich bekomme in der Regel nur den Clip direkt zurück, oder eine leere Geometrie, je nachdem, was Kombinationsmodus, den ich benutze).

Alternativ Wenn dies nicht mit WPF getan werden kann, gibt es eine andere (dritte Partei ist in Ordnung) allgemeine purporse Geometrie-API für .NET, die diese Art von Operationen ausführen kann? Oder kann dies mit anderen Teilen der WPF-Geometrie-API implementiert werden?

+0

Haben Sie GeometryCombineMode.Intersect mit Geometry.Combine verwenden? –

+0

Ich habe sie alle ausprobiert und keiner der Modi hat getan, was ich wollte. –

Antwort

1

-Code zeigt die rechte untere Rechteck wie in Ihrem "kleinere Kacheln" Visualisierung:

var geometry = MyOriginalPath.Data.Clone(); 
var bounds = geometry.Bounds;  
var rectangleGeometry = new RectangleGeometry(bounds); 
var halfWidth = bounds.Width * 0.5; 
var halfHeight = bounds.Height * 0.5; 
var bottomQuarter = new RectangleGeometry(
    new Rect(bounds.X + halfWidth, bounds.Y + halfHeight, 
      halfWidth, halfHeight)); 
var combinedGeometry = new CombinedGeometry(GeometryCombineMode.Exclude, 
              rectangleGeometry, bottomQuarter); 
combinedGeometry = new CombinedGeometry(GeometryCombineMode.Exclude, 
             geometry, combinedGeometry); 
MyBottomQuarterPath.Data = combinedGeometry; 

Grüße Dave