В основном, выберите последний подпункт и привести его в поле зрения, когда элемент расширяется. Если у него нет подпунктов, приведите элемент в поле зрения.
Сложная часть, подэлементы не обязательно доступны, когда событие выполнено, поэтому я предлагаю вам проверить ItemContainerGenerator.Status
, а если он еще не сделан, подпишитесь на событие ItemContainerGenerator.StatusChanged
.
Следующий код тестируется только со статическими элементами, если он создает проблему для динамических источников данных, возможно, мне придется перепроверить несколько деталей.
void TreeViewItem_Expanded(object sender, RoutedEventArgs e)
{
TreeViewItem tvi = e.OriginalSource as TreeViewItem;
if (tvi != null)
{
if (tvi.HasItems)
{
if (tvi.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated)
{
BringLastItemIntoView(tvi.ItemContainerGenerator);
}
else
{
tvi.ItemContainerGenerator.StatusChanged += ItemContainerGenerator_StatusChanged;
}
}
else
{
tvi.BringIntoView();
}
}
}
void ItemContainerGenerator_StatusChanged(object sender, EventArgs e)
{
var s = sender as ItemContainerGenerator;
if (s.Status == GeneratorStatus.ContainersGenerated)
{
BringLastItemIntoView(s);
s.StatusChanged -= ItemContainerGenerator_StatusChanged;
}
}
void BringLastItemIntoView(ItemContainerGenerator generator)
{
var tvi = generator.ContainerFromItem(generator.Items.LastOrDefault()) as TreeViewItem;
if (tvi != null)
{
tvi.BringIntoView();
}
}