WPF ListViewで選択されたアイテムコンテナの座標を取得するにはどうすればよいですか
-
03-07-2019 - |
質問
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>
解決
ContainerFromElement を使用してアイテムのコンテナを取得する必要があります。ビジュアルであり、そこから座標を取得できます。ただし、これをXAMLで表現することはできません。選択した項目が変更されたときに発生するListViewイベントの1つで、コードでそれを行う必要があります。ところで、アイテムは独自のコンテナにできることに注意してください。
XAMLでは、アイテムが選択されていることを示す添付プロパティがアイテムにないため、これを行うことはできません。 (私はしばらくWPFで遊んでいませんでしたので、それは変更されたかもしれません)
他のヒント
今、私は自分で解決策を見つけました。単純なプロパティを検索しましたが、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);
所属していません StackOverflow