2

我想在 ListView 的选定项附近显示一些 WPF 元素。如何获取所选 ListViewItem 的坐标(屏幕或相对坐标)?

<ListView 
    x:Name="TechSchoolListView"
    ClipToBounds="False"
    Width="Auto" Height="Auto" 
    HorizontalContentAlignment="Stretch" 
    VerticalContentAlignment="Top" 
    ItemTemplate="{DynamicResource TechSchoolDataTemplate}" 
    ItemsSource="{Binding Path=TechSchoolResearchList, Mode=Default}" 
    SelectedIndex="1"
    SelectedValue="{Binding Path=SelectedTechSchool, Mode=Default}" 
    SelectionChanged="TechSchoolList_SelectionChanged" 
    ItemContainerStyle="{DynamicResource TechSchoolItemContainerStyle}" 
    ScrollViewer.CanContentScroll="False" 
    ScrollViewer.VerticalScrollBarVisibility="Disabled" >
    <ListView.Background>
        <SolidColorBrush Color="{DynamicResource PanelBackgroundColor}"/>
    </ListView.Background>
</ListView>
4

3 回答 3

3

现在我自己找到了解决方案。我搜索了一个简单的属性,但没有任何意义,因为 WPF 中的所有 UI 元素都是相对的。

这段代码似乎有效:

        UIElement selectedContainer = (UIElement) TechSchoolListView.ItemContainerGenerator.ContainerFromIndex(TechSchoolListView.SelectedIndex);
        Point cursorPos = selectedContainer.TranslatePoint(new Point(selectedContainer.DesiredSize.Width, 0.0), Page);
        PanelCursor.Height = selectedContainer.DesiredSize.Height;
        PanelCursor.Margin = new Thickness(400, cursorPos.Y, 0.0, 0.0);
于 2008-10-20T18:47:08.437 回答
2

您应该使用ContainerFromElement来获取项目的容器,这是一个视觉对象,您可以从那里获取坐标。但是,您不能在 XAML 中表达这一点。您需要在更改所选项目时引发的 ListView 事件之一的代码中执行此操作。顺便说一句,请记住,该项目可以是它自己的容器。

您不能在 XAML 中执行此操作,因为项目上没有显示该项目已被选中的附加属性。(虽然我有一段时间没有玩过 WPF,所以可能已经改变了)

于 2008-10-20T18:46:47.173 回答
0

尽管弗朗西佩诺夫的回答是正确的,但我想提供一个代码示例来展示他所说的对我有用。

UIElement selectedContainer = (UIElement)(sender as 
ListView).ItemContainerGenerator.ContainerFromIndex((sender as 
ListView).SelectedIndex);
Point startPoint = selectedContainer.PointToScreen(new Point(0,0));
于 2021-08-10T14:22:57.660 回答