繁体   English   中英

在WPF中显示形状的CompositeCollection

[英]Display CompositeCollection of shapes in WPF

我想在一个Canvas中显示不同的形状(我在多个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>

如果要通过DataType定位特定的类,则必须指定类型{x:Type ...} 否则,您将按DataTemplate.DataType所述定位XML元素:

如果模板用于对象数据,则此属性包含数据对象的类型名称(以字符串形式)。 要引用类的类型名称,请使用x:Type标记扩展 如果模板用于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是定义LineRectangleCircle类的命名空间

xmlns:somenamespace="clr-namespace:Namespace.To.Your.Classes"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM