ListViewItem滚动到视图时的通知

时间:2018-09-27 16:14:31

标签: wpf

下面的代码应该将一个项目滚动到视图中,并将焦点设置到模板中的第一个子控件上:

lv.ScrollIntoView(lv.SelectedItem);

var lvi = lv.SelectedListViewItem();

//get the item's template parent
var templateParent = lvi.GetFrameworkElementByName<ContentPresenter>();

if (templateParent != null)  <--but it's always null
{
   var ctrl = templateParent.FindVisualChildren<FrameworkElement>().First();
   ctrl.Focus();
}

问题在于,如果ListViewItem不可见,则templateParent为null,并且此代码不起作用。当然,此代码仅在尚不可见的情况下才有用。

是否可以将项目滚动到视图中,然后在其进入视图时得到通知?,以便模板为非空,以便执行ctrl.Focus()代码?

1 个答案:

答案 0 :(得分:0)

您可以处理RequestBringIntoView事件。请参考以下示例代码。

public MainWindow()
{
    InitializeComponent();
    lv.ItemsSource = Enumerable.Range(1, 100);
    lv.SelectedItem = 90;
    lv.ScrollIntoView(lv.SelectedItem);
    lv.RequestBringIntoView += Lv_RequestBringIntoView;
}

private void Lv_RequestBringIntoView(object sender, RequestBringIntoViewEventArgs e)
{
    var container = lv.ItemContainerGenerator.ContainerFromItem(lv.SelectedItem);
    if (container != null)
    {
        //...
    }
}