<ListBox x:Name="lbx"
ItemsSource="{Binding ImgsList,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
SelectedIndex="{Binding SelectedIdx,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
ScrollViewer.ScrollChanged="lbx_ScrollChanged">
<behavior:Interaction.Triggers>
<behavior:EventTrigger EventName="SelectionChanged">
<behavior:InvokeCommandAction Command="{Binding SelectionChangedCommand}"
CommandParameter="{Binding ElementName=lbx}"/>
</behavior:EventTrigger>
</behavior:Interaction.Triggers>
<ListBox.ItemTemplate>
<DataTemplate>
<Image Source="{Binding Path=DataContext,RelativeSource={RelativeSource
Mode=FindAncestor,AncestorType={x:Type ListBoxItem}}}"
Width="{Binding ActualWidth,RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type Window}}}"
Height="{Binding ActualHeight,RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type Window}}}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
private ScrollViewer GetScrollViewer(DependencyObject dobj)
{
if (dobj is ScrollViewer)
{
return dobj as ScrollViewer;
}
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(dobj); i++)
{
var child = VisualTreeHelper.GetChild(dobj, i);
var result = GetScrollViewer(child);
if (result != null)
{
return result;
}
}
return null;
}
private void lbx_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
ListBox listBox = sender as ListBox;
if (listBox != null)
{
ScrollViewer scrollViewer = GetScrollViewer(listBox);
if (scrollViewer != null)
{
int newIdx = (int)(scrollViewer.VerticalOffset / 3);
if (newIdx != prevIdx)
{
Console.WriteLine($"prevIdx:{prevIdx} idx: {newIdx}");
prevIdx = newIdx;
Title = newIdx.ToString();
}
}
}
}
![]()