2016-04-20 2 views
0

Ich muss eine Sammlung von RectangleGeometry-Rechtecken anzeigen, die in einem ViewModel hinzugefügt und entfernt werden, sodass ich eine ObservableCollection von RectangleGeometry-Objekten erstellt habe und innerhalb einer GeometryGroup an sie gebunden habe.In WPF wie binde ich eine ObservableCollection von RectangleGeometry ist?

Um mein Problem wirklich einfach zu sehen, zu machen, ich ohne die MVVM ein sehr einfaches Projekt erstellt. Auch wenn ich an den einfachen Code-Behind binde, erscheinen die Rechtecke nicht. Ich bin immer noch im WPF-Lernmodus, also wenn Sie eine bessere Möglichkeit haben, dies mit Vorlagen oder etwas anderem zu tun, bin ich sehr offen.

XAML:

<Window x:Class="MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="clr-namespace:WpfApplication1" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     Title="MainWindow" 
     Width="1024" 
     Height="768" 
     mc:Ignorable="d"> 
    <Grid> 
     <Canvas> 
     <Path Fill="Red" Opacity=".4"> 
      <Path.Data> 
       <GeometryGroup Children="{Binding Rectangles}" 
           FillRule="NonZero" /> 
      </Path.Data> 
     </Path> 
     </Canvas> 
    </Grid> 
</Window> 

-Code-behind:

Imports System.Collections.ObjectModel 

Class MainWindow 

    Public Sub New() 
     InitializeComponent() 
     Rectangles = New ObservableCollection(Of RectangleGeometry) 
     Rectangles.Add(New RectangleGeometry(New Rect(50, 50, 500, 100))) 
     Rectangles.Add(New RectangleGeometry(New Rect(50, 50, 100, 500))) 
     Rectangles.Add(New RectangleGeometry(New Rect(200, 200, 100, 100))) 
     Rectangles.Add(New RectangleGeometry(New Rect(400, 400, 100, 100))) 
     Rectangles.Add(New RectangleGeometry(New Rect(20, 20, 100, 100))) 
    End Sub 

    Public Property Rectangles As ObservableCollection(Of RectangleGeometry) 

End Class 
+0

Werfen Sie einen Blick auf [diesen Beitrag] (http://stackoverflow.com/a/22325266/1136211). Sie können das Rectangle in der ItemTemplate durch einen Path ersetzen, der in seiner Data-Eigenschaft über RectangleGeometry verfügt. Sie könnten dann auch den ItemContainerStyle vermeiden, da Sie die Eigenschaften Canvas.Left und Canvas.Top nicht binden müssen. – Clemens

+0

Danke. Ich untersuche es jetzt. – IWishUWell

Antwort

0

Sie diesen völlig falsche Weg. Auf der einen Seite versucht man, GUI-Objekte (das heißt RectangeGeometry) direkt und dann auf der anderen Seite Sie versuchen, Daten zu verwenden, die Bindung zu konstruieren. Wähle eins.

Wenn Sie sich entscheiden Databinding verwenden dann stattdessen zu einer ObservableCollection von denen eine Datenstruktur für die Rechteck-Objekte und binden erstellen. Verwenden Sie kein Canvas, verwenden Sie ein ItemsControl mit ItemPanel, das auf Canvas festgelegt ist. Überschreiben Sie die ItemTemplate für die Artikel, die Sie mit Datatemplate ziehen und dann die Canvas.Left/Canvas.Top Parameter im ItemContainerStyle.

+0

Danke. Ich werde recherchieren, wie das gemacht wird, und zurück zu dir kommen. Ich habe nicht gut erklärt, warum ich tun muss, was ich mache. Ich muss Rechtecke über ein Bild mit der Deckkraft .4 zeichnen, aber ich kann nicht zulassen, dass sie undurchsichtiger werden, wenn sie sich überlappen. Deshalb wähle ich RectangleGeometry. Wenn ich stattdessen ein UIElement ziehe, wäre es viel einfacher, aber für Überlappungen erhöht sich die Deckkraft. – IWishUWell