WPF: установка фокуса на элемент управления внутри ItemsControl - PullRequest
1 голос
/ 15 ноября 2010

У меня есть ItemsControl, который связан с источником данных и генерирует несколько контейнеров. Я использую код, чтобы гарантировать, что только один из контейнеров виден в любой момент времени. Контейнеры используют TemplateSelector, поэтому содержимое каждого контейнера отличается (что исключает поиск элемента управления по имени).

Я бы хотел установить фокус клавиатуры на первый элемент управления в видимом в данный момент контейнере. Я добавил обработчик события в событие IsVisibleChanged для каждого контейнера, но когда я получаю доступ к VisualTree, дочерних элементов нет.

Есть идеи?

1 Ответ

0 голосов
/ 16 ноября 2010

Вы можете установить фокус на дочерний элемент только после того, как сам дочерний элемент стал видимым.Один из вариантов - найти дочерний элемент, на который вы хотите сфокусироваться, а затем добавить обработчик к его IsVisibleChanged.В обработчике сфокусируйте объект, а затем удалите обработчик.

private void stackPanel1_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    if (stackPanel1.IsVisible)
    {
        UIElement elm = stackPanel1.Children[0];
        FrameworkElement fwe = (FrameworkElement)elm;
        fwe.IsVisibleChanged += new DependencyPropertyChangedEventHandler(fwe_IsVisibleChanged);
    }
}

void fwe_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    FrameworkElement fwe = (FrameworkElement)sender;
    fwe.IsVisibleChanged -= new DependencyPropertyChangedEventHandler(fwe_IsVisibleChanged);
    Keyboard.Focus((IInputElement)sender);
}

Редактировать: вы должны иметь доступ к коллекции элементов в обработчике событий IsVisibleChanged.код:

void sp1_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
     Console.WriteLine(sp1.Items.Count);
}
...