代码之家  ›  专栏  ›  技术社区  ›  ChaosSpeeder

如何获取WPF ListView中选定项容器的坐标

  •  2
  • ChaosSpeeder  · 技术社区  · 17 年前

    我想在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>
    
    3 回复  |  直到 15 年前
        1
  •  3
  •   ChaosSpeeder    17 年前

    现在我自己找到了解决办法。我搜索了一个简单的属性,但它没有意义,因为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
  •  2
  •   Franci Penov    17 年前

    你应该使用 ContainerFromElement 要获取项目的容器,这是一个可视化的容器,从那里你可以获得坐标。但是,您无法在XAML中表达这一点。您需要在代码中,在选定项更改时引发的ListView事件之一上执行此操作。顺便说一句,请记住,物品可以是自己的容器。

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

        3
  •  0
  •   PWCoder    5 年前

    尽管Franci Penov的回答是正确的,但我想提供一个代码示例,以展示他所说的对我来说是如何起作用的。

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