Come posso ottenere le coordinate di un contenitore di articoli selezionato in un ListView WPF

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

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>
È stato utile?

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top