Comment puis-je obtenir les coordonnées d'un conteneur d'élément sélectionné dans un ListView WPF

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

Question

Je souhaite afficher certains éléments WPF à proximité de l'élément sélectionné d'un ListView. Comment puis-je obtenir les coordonnées (écran ou relatives) du ListViewItem sélectionné?

<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>
Était-ce utile?

La solution

Utilisez ContainerFromElement pour obtenir le conteneur de l'élément, qui est un visuel et à partir de là, vous pouvez obtenir les coordonnées. Vous ne pouvez toutefois pas exprimer cela en XAML. Vous devez le faire dans le code, sur l'un des événements ListView, déclenché lorsque l'élément sélectionné est modifié. Btw, gardez à l'esprit que l'élément peut être son propre conteneur.

Vous ne pouvez pas faire cela en XAML, car il n'y a pas de propriété attachée sur l'élément qui montre que l'élément est sélectionné. (Bien que je n'aie pas joué avec WPF depuis un moment, ça a peut-être changé)

Autres conseils

Maintenant, j'ai trouvé une solution par moi-même. J'ai cherché une propriété simple, mais cela n'avait aucun sens, car tous les éléments d'interface utilisateur du fichier WPF sont relatifs.

Ce code semble fonctionner:

        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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top