【问题标题】:Silverlight binding to canvas, element location in list at element?Silverlight绑定到画布,元素列表中的元素位置?
【发布时间】:2012-01-27 14:47:21
【问题描述】:

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

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

但是,所有控件都放在彼此的正上方。解决此问题的一种简单方法当然是将 Canvas 设为 WrapPanel,但我不确定这是否会与控件上的拖放功能发生冲突

所以我的问题是,是否有可能在模型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); } }

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

【问题讨论】:

    标签: c# silverlight list model


    【解决方案1】:

    在 Canvas 中放置元素时,必须指定放置元素的坐标(每个元素的左上角)。也许更好地从 Canvas 派生一个新类,该类将为您执行放置并将此类用于 ItemsPanelTemplate。此外,拖放应与 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;
        }
    }
    ...
    }
    

    这个例子可以大大改进。

    【讨论】:

    • 不确定我们是否相互理解。我希望根据列表中元素的位置自动指定坐标。查看我的更新
    • 从 Canvas 派生的新类可以在添加元素时计算位置。这个类的一个实例知道有多少孩子以及在哪里放置一个新孩子。
    • 你能不能举个小例子,因为我不完全明白你的意思。
    • 解决问题的另一种方法。在列表中添加元素时可以使用 Canvas.SetTop 和 Canvas.SetLeft。
    【解决方案2】:

    你需要一个自定义面板,所以你可以创建一个类并继承自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

    【讨论】:

      【解决方案3】:

      如果你有 GetX 和 GetY 属性,你可以按照这里接受的答案做同样的事情:

      Silverlight 3 - Data Binding Position of a rectangle on a canvas

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-27
        • 2012-06-13
        • 1970-01-01
        • 2011-01-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多