¿Cómo puedo obtener las coordenadas de un contenedor de elementos seleccionados en un ListView de WPF?

StackOverflow https://stackoverflow.com/questions/219369

Pregunta

Quiero mostrar algunos elementos WPF cerca del elemento seleccionado de un ListView. ¿Cómo puedo obtener las coordenadas (pantalla o pariente) del ListViewItem seleccionado?

<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>
¿Fue útil?

Solución

Debería usar ContainerFromElement para obtener el contenedor del elemento, que Es un visual y desde allí se pueden obtener las coordenadas. Sin embargo, no puedes expresar esto en XAML. Debe hacerlo en código, en uno de los eventos de ListView, generado cuando se cambia el elemento seleccionado. Por cierto, tenga en cuenta que el elemento puede ser su propio contenedor.

No puede hacer esto en XAML, ya que no hay una propiedad adjunta en el elemento que muestra que el elemento está seleccionado. (aunque no he jugado con WPF en un tiempo, por lo que podría haber cambiado)

Otros consejos

Ahora he encontrado una solución por mi cuenta. He buscado una propiedad simple, pero no tenía sentido, porque todos los elementos de la interfaz de usuario en el WPF son relativos.

Este código parece estar funcionando:

        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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top