Silverlight绑定到画布,元素在元素的列表中的位置



我创建了一个自定义用户控件,它基本上是一个ItemsControl,其ItemsPanelTemplate设置为画布。

在主页面上,我将一个List<Element>绑定到它,其中Element是一个自定义类。

但是,所有控件都放置在彼此的正上方。当然,解决这个问题的一个简单方法是将Canvas制作成WrapPanel,但我不确定这是否会与Drag&降落在控制上

所以我的问题是,在模型Element中是否可能有一个属性,如果它在列表中,它会检查它在列表的哪个位置?

类似于:

public class Element 
{
    public int positionInList { get { return (this.IsInList) ? this.ListPosition : 0; } }
}

更新

我希望实现的是,当元素被添加到画布时,它们会自动通过2个属性(将绑定到canvas。Left和canvas。Top或类似的属性)选择位置。

public double GetX { get { return 50 * (Element.PositionInList % 5); } }
public double GetY { get { return 50 * (Element.PosotionInList / 5); } }

而无需手动设置元素在列表中的位置。

在画布中放置元素时,必须指定放置元素的坐标(每个元素的左上角)。也许最好从Canvas派生一个新的类,它将为您执行放置并将该类用于ItemsPanelTemplate。此外,Drag&Drop应该适用于WrapPanel,但取决于您的要求。

快速且非最佳的样本:

class CustomCanvas : Canvas
{
private int mChildsNum = 0;
...
CustomCanvas()
{
    // Track changes that appear in canvas when new
    // children are added
    this.LayoutUpdated += CanvasChangeTracker;
}
...
private void CanvasChangeTracker(object source, EventArgs e)
{
    if ( this.Children.Count != mChildsNum )
    {
        // A new child was added.
        // Update the coordinates for children
        mChildsNum = this.Children.Count;
    }
}
...
}

这个例子可以大大改进。

您需要一个自定义面板,这样您就可以创建一个类并从Panel继承。这将实现两种方法来覆盖

protected override Size MeasureOverride(Size availableSize)
protected override Size ArrangeOverride(Size finalSize)

你必须执行。

以下是一个示例:http://www.codeproject.com/Articles/31537/Custom-Panel-in-Silverlight-Advanced-Canvas

如果您有属性GetX和GetY,您可以在这里执行与接受的答案相同的操作:

Silverlight 3-画布上矩形的数据绑定位置

我只想回复你的帖子,因为这不是我的答案,但我想我没有足够的代表来回复。

最新更新