2008-10-20 3 views
2

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 relatif) du ListViewItem sélectionné?Comment puis-je obtenir les coordonnées d'un conteneur d'élément sélectionné dans un ListView WPF

<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> 

Répondre

2

Vous devez utiliser ContainerFromElement pour obtenir le conteneur de l'élément, qui est un visuel et à partir de là, vous pouvez obtenir les coordonnées. Cependant, vous ne pouvez pas l'exprimer 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é jointe sur l'élément qui montre que l'élément est sélectionné. (bien que je n'ai pas joué avec WPF depuis un moment, cela aurait pu changer)

+0

Merci, mais je dois donner un ItemsControl à la fonction ContainerFromElement. Où ai-je obtenu le ItemsControl pour l'article sélectionné? – ChaosSpeeder

+0

ContainerFromElement() a deux surcharges. L'un d'eux est statique et nécessite l'instance ItemsControl. L'autre est la méthode d'instance et ne prend que l'élément. Dans votre cas, ce sera comme ceci: TechSchoolListView.ContainerFromElement (<élément sélectionné>). –

+0

Merci beaucoup. – ChaosSpeeder

3

Maintenant, j'ai trouvé une solution par moi-même. J'ai recherché une propriété simple, mais cela n'a aucun sens, car tous les éléments d'interface utilisateur dans le 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); 
Questions connexes