Как получить координаты выбранного контейнера элементов в представлении списка WPF


Я хочу отобразить некоторые элементы WPF рядом с выбранным элементом ListView. Как получить координаты (экранные или относительные) выбранного объекта 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>
2 2

2 ответа:

Вы должны использовать ContainerFromElement, чтобы получить контейнер элемента, который является визуальным, и оттуда вы можете получить координаты. Однако вы не можете выразить это в XAML. Это нужно сделать в коде, в одном из событий ListView, возникающих при изменении выбранного элемента. Кстати, имейте в виду, что предмет может быть собственным контейнером.

Это невозможно сделать в XAML, так как в элементе нет вложенного свойства, которое показывает, что элемент выбран. (хотя я не играл с WPF в течение года. в то время как, так что могло бы измениться)

Теперь я нашел решение самостоятельно. Я искал простое свойство, но оно не имело смысла, потому что все элементы пользовательского интерфейса в WPF относительны.

Этот код, кажется, работает:

        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);