我有一个使用 UserControl 作为 DataTemplate 的 ListView:
<ListView>
<ListView.ItemTemplate>
<DataTemplate>
<views:TaskerInfoView />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
我需要放置在 TaskerInfoView 用户控件内的按钮的绝对屏幕坐标。
我试过这段代码:
var newButtonPoint = button.PointToScreen(new Point(0, 0));
但我收到了异常“此 Visual 未连接到 PresentationSource”我想是因为该按钮位于 DataTemplate 内,因此它未连接到可视元素。
更新我发现了为什么我收到了这个异常:在PointToScreen
调用之前我将项目移动到 ObersvableCollection 中,即 ListView 的 ItemsSource:
this._taskList.Move(currentIndex, currentIndex - 1); // _taskList is the ObservableCollection<>
var newButtonPoint = button.PointToScreen(new Point(0, 0));
如果我删除ObservableCollection<>.Move
, PointToScreen 工作正常。
我认为在内部ObservableCollection<>.Move
删除了该项目并将另一个项目插入到新位置。引发异常是因为button
包含对实际与 TreeVisual 断开连接的已删除元素的引用