1

我有一个使用 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 断开连接的已删除元素的引用

4

1 回答 1

1

例如 :

xml:

    <ListBox x:Name="myListBox" SelectedIndex="2">
        <ListBoxItem>1</ListBoxItem>
        <ListBoxItem>2</ListBoxItem>
        <ListBoxItem>3</ListBoxItem>
        <ListBoxItem>4</ListBoxItem>
        <ListBoxItem>5</ListBoxItem>
    </ListBox>

    <Button Content="GetIndexFromContainer" Click="Button_Click" />

CS :

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        var index = GetSelectedIndexFromList();
    }

    private int GetSelectedIndexFromList()
    {
        var container = myListBox.ItemContainerGenerator.ContainerFromItem(MyListBox.SelectedItem);
        var index = myListBox.ItemContainerGenerator.IndexFromContainer(container);
        return index;
    }
于 2013-09-01T17:39:15.440 回答