Как я могу получить координаты выбранного элемента контейнера в WPF ListView
-
03-07-2019 - |
Вопрос
Я хочу отобразить некоторые элементы 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>
Решение
Вы должны использовать 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);