Pergunta

Eu quero mostrar alguns elementos WPF próximo ao item selecionado de um ListView. Como posso obter as coordenadas (tela ou relativos) do ListViewItem selecionado?

<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>
Foi útil?

Solução

Você deve usar ContainerFromElement para obter recipiente do item, que é um visual e de lá você pode obter as coordenadas. Você não pode expressar isso em XAML, no entanto. Você precisa fazê-lo no código, em um dos eventos ListView, levantadas quando o item selecionado é alterado. Btw, tenha em mente que o item pode ser o seu próprio recipiente.

Você não pode fazer isso em XAML, como não há nenhuma propriedade anexada no item que mostra o item é selecionado. (Embora eu não tenha jogado com WPF em quando, para que possa ter alterado)

Outras dicas

Agora eu ter encontrado uma solução por mim. Eu tenho procurado uma propriedade simples, mas não fazia sentido, porque todos os elementos da interface do usuário no WPF são 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top