我创建了一个自定义用户控件,基本上是ItemsControl
,其ItemsPanelTemplate
设置为画布。
在主页上,我将List<Element>
绑定到它,其中Element是一个自定义类。
但是,所有控件都放在彼此的顶部。解决这个问题的一个简单方法是将Canvas设为WrapPanel,但我不确定这是否会与Drag&amp;放下控件
所以我的问题是,是否有可能在模型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); } }
无需手动设置元素在列表中的位置。
答案 0 :(得分:0)
在Canvas中放置元素时,必须指定放置元素的坐标(每个元素的左上角)。也许最好从Canvas派生一个新类,它将为您执行放置并将此类用于ItemsPanelTemplate。另外,Drag&amp; 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;
}
}
...
}
这个例子可以大大改善。
答案 1 :(得分:0)
您需要一个自定义面板,因此您可以创建一个类并继承自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
答案 2 :(得分:0)
如果你有GetX和GetY属性,你可以在这里做同样的接受答案:
Silverlight 3 - Data Binding Position of a rectangle on a canvas
我会回复你的帖子,因为这不是我的答案,但我想我没有足够的代表回复。