我尝试使用链接答案中提供的解决方案,但是当我给它列出ListBox绑定的图像时,它给了我错误的位置,因为项目模板加载的是源URL而不是实际图像,似乎数据为空。
我的项目模板如下所示:
<ListBox ItemsSource="{Binding Items}"
HorizontalContentAlignment="Left"
VerticalContentAlignment="Center"
ScrollViewer.VerticalScrollBarVisibility="Disabled"
ScrollViewer.HorizontalScrollBarVisibility="Visible"
Height="64" Name="listBoxSource"
VerticalAlignment="Bottom"
SelectionChanged="listBoxSource_SelectionChanged" Canvas.Left="32" Canvas.Top="365" Width="596"
>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Image x:Name="ListImage" Source="{Binding thumbnailURL}" Height="64" Width="64"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
如何访问当前所选项目的“ListImage”?
答案 0 :(得分:1)
点击活动即可:
private void image_Tap(object sender,System.Windows.Input.GestureEventArgs e)
{
Image selectedImage = e.OriginalSource as Image;
}
这就是你需要的吗?
答案 1 :(得分:1)
每个ItemsControl都有一个ItemsContainerGenerator,它(令人惊讶的是)负责为列表中的每个项生成一个控件。它提供了一些有用的方法来查找给定项的容器,反之亦然。您可以像这样使用它:
private void listBoxSource_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var listBox = (ListBox) sender;
var containerGenerator = listBox.ItemContainerGenerator;
var container = (UIElement)containerGenerator.ContainerFromItem(listBox.SelectedItem);
}
然后,您可以使用变量容器和其他帖子中的解决方案来查找坐标,
Point position = container.GetRelativePosition(Application.Current.RootVisual);
另外,在你的DataTemplate中你不需要StackPanel,因为ListBox提供了它的ItemsPanelTemplate。
<DataTemplate>
<Image x:Name="ListImage" Source="{Binding thumbnailURL}" Height="64" Width="64"/>
</DataTemplate>
答案 2 :(得分:0)
我建议使用不同的解决方案,因为您尝试解决它的方式(找到控件)很容易出错。
将DataTemplate设为资源,并使用ItemTemplate="{StaticResource myTemplate}"
接下来,当选择一个项目时,将ContentControl添加到Canvas,将其ContentTemplate设置为相同的DataTemplate,将DataContext设置为SelectedItem。
这样你只需要定义一次模板(一个地方来维护它),而不必走VisualTree。