首先简要介绍
我想将不同列表视图中的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有两个名为StatusChanged
和ItemsChanged
的事件。我读过的一些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
}
}
}
但是,我无法让StatusChanged
和ItemsChanged
工作。调试时,我可以看到listview在list ItemContainerGenerator_ItemsChanged
方法中填充了listviewitems,但this.ItemContainerGenerator.ContainerFromIndex(i) as UIElement
返回null。为什么会在MouseOver事件中完全正常工作?