Come posso ottenere le coordinate di un contenitore di articoli selezionato in un ListView WPF
-
03-07-2019 - |
Domanda
Voglio visualizzare alcuni elementi WPF vicino all'elemento selezionato di un ListView. Come posso ottenere le coordinate (schermo o relativo) dell'oggetto ListViewItem selezionato?
<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>
Soluzione
Dovresti usare ContainerFromElement per ottenere il contenitore dell'articolo, che è un visual e da lì puoi ottenere le coordinate. Non puoi esprimerlo in XAML, tuttavia. È necessario farlo nel codice, su uno degli eventi ListView, generato quando l'elemento selezionato viene modificato. A proposito, tieni presente che l'articolo può essere il suo contenitore.
Non puoi farlo in XAML, poiché sull'oggetto non è presente alcuna proprietà che mostra che l'elemento è selezionato. (anche se non gioco con WPF da un po ', quindi potrebbe essere cambiato)
Altri suggerimenti
Ora ho trovato una soluzione da solo. Ho cercato una proprietà semplice, ma non ha senso, perché tutti gli elementi dell'interfaccia utente nel WPF sono relativi.
Questo codice sembra funzionare:
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);