WPF ItemContainerGenerator.ContainerFromIndex为现有项

时间:2015-11-05 19:08:23

标签: c# wpf

首先简要介绍
我想将不同列表视图中的listviewitems与画布中的线连接起来。因此,我需要画布中每个ListViewItem的位置才能绘制线条的点。

我尝试了什么
我现在已经尝试了很多东西并浏览了一半的互联网,但是我还没把它们放在一起。

到目前为止,最好的结果是以下代码:

public class ConnectableListView : ListView
{

    public ConnectableListView() : base()
    {
        this.MouseEnter += this.onMouseEnter;
    }

    private void onMouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
    {
        for (int i = 0; i < this.Items.Count; i++)
        {
            UIElement ItemContainer = this.ItemContainerGenerator.ContainerFromIndex(i) as UIElement;
            // Get measures and positions from the ItemContainer
        }

    }

}

所有这么长,但MouseEnter事件最终不是我想要绑定到的,而是加载列表框时触发的某些事件。我发现ItemContainerGenerator有两个名为StatusChangedItemsChanged的事件。我读过的一些Q&amp; A(现在不记得引用)表示当ListView填充了项目时会发生这些事件。如您所见,我已在下面的代码中实现了StatusChanged事件(我也以同样的方式尝试了ItemsChanged事件。)

public class ConnectableListView : ListView
{

    public ConnectableListView() : base()
    {
        this.ItemContainerGenerator.StatusChanged += ItemContainerGenerator_ItemsChanged;
    }

    private void ItemContainerGenerator_ItemsChanged(object sender, System.Windows.Input.MouseEventArgs e)
    {
        for (int i = 0; i < this.Items.Count; i++)
        {
            UIElement ItemContainer = this.ItemContainerGenerator.ContainerFromIndex(i) as UIElement;
            // Get measures and positions from the ItemContainer
        }

    }
}

但是,我无法让StatusChangedItemsChanged工作。调试时,我可以看到listview在list ItemContainerGenerator_ItemsChanged方法中填充了listviewitems,但this.ItemContainerGenerator.ContainerFromIndex(i) as UIElement返回null。为什么会在MouseOver事件中完全正常工作?

0 个答案:

没有答案