經過一段時間的實驗後,我想出了一個滿足我需求的解決方案。我會在這裏張貼爲後人。希望它可以在這個問題上花費大約6個小時的時間來節省其他人。我用
夫婦類在別處定義:
- PlanarElement:簡單地描述了一個2D的「東西」有邊界屬性暴露多邊形和開口財產暴露多邊形的IEnumerable對象列表
- 多邊形:2D平面幾何類露出型的IEnumerable Point類型的屬性
- 點:三維幾何點
這裏是解決方案:
1)這是到我PlanarMembers必將
<ItemsControl>
<ItemsControl.Resources>
<DataTemplate DataType="{x:Type o:PlanarMember}">
<Path Stroke="Black" StrokeThickness="1"
Data="{Binding Converter={StaticResource PlanarMemberConverter}}">
<Path.Fill>
<SolidColorBrush Opacity="0.5" Color="LightGray" />
</Path.Fill>
</Path>
</DataTemplate>
</ItemsControl.Resources>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas RenderTransform="{StaticResource CurrentDisplayTransform}"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
2)注意在Path的數據設定使用PlanarMemberConverter的ItemsControl的,在這裏創建:
<this:PlanarMemberConverter x:Key="PlanarMemberConverter" />
3)實際的IValueCo此處定義了逆變器派生類:
[ValueConversion(typeof(PlanarMember), typeof(Geometry))]
class PlanarMemberConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (targetType != typeof(Geometry)) return null;
var planarMember = value as PlanarMember;
var collection = new PathFigureCollection(planarMember.Openings.Count() + 1)
{
new PathFigure(
planarMember.Boundary.Vertices.First().AsPoint(),
ToSegments(planarMember.Boundary.Vertices), true){IsFilled = true}
};
foreach (var opening in planarMember.Openings)
{
collection.Add(new PathFigure(
opening.Vertices.First().AsPoint(),
ToSegments(opening.Vertices), true) { IsFilled = true });
}
return new PathGeometry(collection) {FillRule = FillRule.EvenOdd};
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
public IEnumerable<PathSegment> ToSegments(IEnumerable<Point> points)
{
return
from point in points
select (PathSegment)new LineSegment(point.AsPoint(), true);
}
}