Как получить координаты выбранного контейнера элементов в представлении списка 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 ответа:
Вы должны использовать 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);