我想在ListView的选定项目附近显示一些WPF元素。如何获取所选ListViewItem的坐标(屏幕或相对)?
<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>
答案 0 :(得分:3)
现在我已经找到了自己的解决方案。我搜索了一个简单的属性,但没有任何意义,因为WPF中的所有UI元素都是相对的。
此代码似乎正在运行:
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);
答案 1 :(得分:2)
您应该使用ContainerFromElement来获取项目的容器,这是一个视觉效果,从那里您可以获得坐标。但是,您无法在XAML中表达这一点。您需要在其中一个ListView事件的代码中执行此操作,并在更改所选项目时引发。顺便说一下,请记住该物品可以是自己的容器。
您无法在XAML中执行此操作,因为项目上没有附加属性,表明该项目已被选中。 (虽然我有一段时间没有玩WPF,所以可能已经改变了)
答案 2 :(得分:0)
尽管 Franci Penov 的回答是正确的,但我还是想提供一个代码示例来展示他所说的内容对我来说是如何工作的。
UIElement selectedContainer = (UIElement)(sender as
ListView).ItemContainerGenerator.ContainerFromIndex((sender as
ListView).SelectedIndex);
Point startPoint = selectedContainer.PointToScreen(new Point(0,0));