我想在一个Canvas中显示不同的形状(我在多个画布上有一个解决方案 - 但这不允许我选择所有形状,因此它毫无价值)。我将我的形状放在CompositeCollection中,并在一个ItemsControl中使用多个DataTemplates。但是,程序不显示形状,而是在位置X,Y中显示属性名称。
这是集合:
Page.Collection.Add(new CollectionContainer() { Collection = Page.Lines });
Page.Collection.Add(new CollectionContainer() { Collection = Page.Rectangles });
Page.Collection.Add(new CollectionContainer() { Collection = Page.Circles });
这是课程页面的一部分:
public class Page:ViewModelBase,INotifyPropertyChanged
{
ObservableCollection<Line> lines = new ObservableCollection<Line>();
ObservableCollection<Rectangle> rectangles = new ObservableCollection<Rectangle>();
ObservableCollection<Circle> circles = new ObservableCollection<Circle>();
CompositeCollection collection = new CompositeCollection();
public CompositeCollection Collection
{
get
{
return collection;
}
set
{
collection = value;
OnPropertyChanged("Collection");
}
}
public ObservableCollection<Line> Lines
{
get
{
return lines;
}
set
{
lines = value;
OnPropertyChanged("Lines");
}
}
这是XAML:
<ItemsControl ItemsSource="{Binding Page.Collection}" Grid.Row="1" Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas IsItemsHost="True" Grid.Row="1" Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
Background="Transparent">
</Canvas>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Canvas.Left" Value="{Binding Start.X}"/>
<Setter Property="Canvas.Top" Value="{Binding Start.Y}"/>
</Style>
</ItemsControl.ItemContainerStyle>
<ItemsControl.Resources>
<DataTemplate DataType="Page.Lines">
<Line X1="{Binding Start.X}"
Y1="{Binding Start.Y}"
X2="{Binding End.X}"
Y2="{Binding End.Y}" Stroke="Black" StrokeThickness="1" />
</DataTemplate>
<DataTemplate DataType="Page.Rectangles">
<Rectangle
Width="{Binding Extend.X}"
Height="{Binding Extend.Y}" Stroke="Black" StrokeThickness="1" />
</DataTemplate>
<DataTemplate DataType="Page.Circles">
<Ellipse
Width="{Binding Extend.X}"
Height="{Binding Extend.Y}" Stroke="Black" StrokeThickness="1" />
</DataTemplate>
</ItemsControl.Resources>
</ItemsControl>
答案 0 :(得分:1)
如果您希望按DataType
定位特定类,则必须指定类型{x:Type ...}
。如果没有它,您将按照DataTemplate.DataType
中所述的目标定位XML元素:
如果模板用于对象数据,则此属性包含数据对象的类型名称(作为字符串)。 要引用类的类型名称,请使用x:Type Markup Extension 。如果模板用于XML数据,则此属性包含XML元素名称。有关为XML元素指定非默认命名空间的详细信息,请参阅文档备注。
所以你的XAML看起来应该是这样的
<DataTemplate DataType="{x:Type somenamespace:Line}">
<!-- removed content -->
</DataTemplate>
<DataTemplate DataType="{x:Type somenamespace:Rectangle}">
<!-- removed content -->
</DataTemplate>
<DataTemplate DataType="{x:Type somenamespace:Circle}">
<!-- removed content -->
</DataTemplate>
其中somenamespace
是定义Line
,Rectangle
和Circle
类的命名空间
xmlns:somenamespace="clr-namespace:Namespace.To.Your.Classes"