【问题标题】:How can I obtain the coordinates of a selected item container in a WPF ListView如何在 WPF ListView 中获取所选项目容器的坐标
【发布时间】:2010-09-18 04:13:10
【问题描述】:

我想在 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>

【问题讨论】:

    标签: wpf listview coordinates selecteditem


    【解决方案1】:

    现在我自己找到了解决方案。我搜索了一个简单的属性,但没有任何意义,因为 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);
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 谢谢,但我必须给 ContainerFromElement 函数一个 ItemsControl。我从哪里获得所选项目的 ItemsControl?
      • ContainerFromElement() 有两个重载。其中之一是静态的,需要 ItemsControl 实例。另一种是实例方法,只接受Item。在你的情况下,它会是这样的:TechSchoolListView.ContainerFromElement()。
      【解决方案3】:

      虽然 Franci Penov 的回答是正确的,但我想提供一个代码示例来展示他所说的内容对我有何帮助。

      UIElement selectedContainer = (UIElement)(sender as 
      ListView).ItemContainerGenerator.ContainerFromIndex((sender as 
      ListView).SelectedIndex);
      Point startPoint = selectedContainer.PointToScreen(new Point(0,0));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多