質問

これをレンダリングする方法に頭を包むことはできません

public class Shape{}
public class Circle: Shape{}
public class Square: Shape
{
    public List<Circle> CircleList{ get; private set; }
}

Shapeオブジェクトを保持するリストがありますが、ここで達成したいのは、各オブジェクトをグリッドにレンダリングすることです。

オブジェクトがSquareの場合、CircleListプロパティのCircleアイテムを保持するネストされたグリッドが必要です

ItemsControlとHierarchicalDataTemplateを試してみましたが、機能しませんでした。ItemsControl内にItemsControlをネストしようとしました。WPFが初めてなので、 「適切」解決策になります。 TreeViewで上記を何とかレンダリングしましたが、達成しようとしているのは、図形をレンダリングする描画ボードです。

更新

「ドローイングボード」アイテムを含める必要があり、各アイテムはコンテナでレンダリングする必要があります。

オブジェクトのタイプがSquareの場合、Squareコンテナには、CircleListプロパティのCircleオブジェクトを保持するネストされたコンテナが必要です。

役に立ちましたか?

解決

Scottはかなり近いですが、まったくではありません。グリッドのDataContextを設定しても、含まれているCircleオブジェクトはレンダリングされません。必要なのは、独自のアイテムをレンダリングし、そのコントロールのItemsSourceプロパティをCircleListにバインドできる埋め込みコントロールです。

これを示す元のクラスを使用して例を作成しました。コードビハインドは次のとおりです。

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();

        Square square = new Square();
        square.CircleList = new List<Circle>() { new Circle(25) };
        _shapes.Add(square);
    }

    private List<Shape> _shapes = new List<Shape>();

    public List<Shape> Shapes
    {
        get { return _shapes; }
    }
}

public abstract class Shape { }

public class Circle : Shape
{
    public double Diameter { get; private set; }

    public Circle(double diameter)
    {
        Diameter = diameter;
    }
}

public class Square : Shape
{
    public List<Circle> CircleList { get; set; }
}

これで、直径25の円を含む1つの正方形がシェイプリストに追加されたことがわかります。これは、絶対座標を使用したシェイプの配置のサポートを追加しないことに注意してください。そのための準備が既に整っていると思います。

XAMLの今:

<Window x:Class="TestWpfApplication.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TestWpfApplication"
Title="Window1"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Window.Resources>
    <DataTemplate DataType="{x:Type local:Circle}">
        <Ellipse Stroke="Black" 
                 Width="{Binding Diameter}" 
                 Height="{Binding Diameter}"/>
    </DataTemplate>
    <DataTemplate DataType="{x:Type local:Square}">
        <Border BorderThickness="1" BorderBrush="Black">
            <ItemsControl ItemsSource="{Binding CircleList}"/>
        </Border>
    </DataTemplate>
</Window.Resources>

<ListBox ItemsSource="{Binding Shapes}">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas/>
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
</ListBox>

DataTemplatesは次のとおりです。円が単に楕円でレンダリングされていることがわかります。一方、Squareには、含まれているアイテムをレンダリングするItemsControlが埋め込まれています。また、四角い形を作るためにその周りにボーダーを描きました。

結果は次のとおりです。

代替テキストhttp://img212.imageshack.us/img212/8658/squarewithcirclecontent .png

他のヒント

2つのDataTemplatesを使用してみてください。1つは円用(1つは円をレンダリングする)、もう1つは正方形用です。 Square DataTemplateは、グリッドをレンダリングして(正方形に見えるように境界線を付けるだけ)、ネストされたグリッドのDataContext =&quot; {Binding CircleList}&quot;を設定します。

シェイプのリストをグリッドに変換する方法が100%確実ではありませんが、すでに解決済みのように聞こえますので、簡単にするために省略します。 :)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top