В wpf, как я могу получить следующий элемент управления в порядке вкладок - PullRequest
7 голосов
/ 22 апреля 2011

Я знаю, как установить фокус на следующий элемент управления в порядке вкладок, но на самом деле я не хочу менять фокус ... Я просто хочу получить следующий элемент управления в порядке табуляции (возможно, получить также предыдущий, первый и последний). Итак ... howyadodat?

M

Ответы [ 3 ]

1 голос
/ 21 октября 2016

PredictFocus(FocusNavigationDirection.Next) не работает, как сказал @Cameron.Мой код обёртки, основанный на посте @Randolpho, теперь работает хорошо.

Я попробовал несколько шаблонов и, наконец, пришел к выводу, что должен убедиться, что container на самом деле является одним из родителей e, чтобы избежать неожиданных результатов..

/// <summary>
/// Get next tab order element.
/// </summary>
/// <param name="e">The element to get next tab order</param>
/// <param name="container">The container element owning 'e'. Make sure this is a container of 'e'.</param>
/// <param name="goDownOnly">True if search only itself and inside of 'container'; otherwise false.
/// If true and next tab order element is outside of 'container', result in null.</param>
/// <returns>Next tab order element or null if not found</returns>
public DependencyObject GetNextTab(DependencyObject e, DependencyObject container, bool goDownOnly)
{
    var navigation = typeof(FrameworkElement)
        .GetProperty("KeyboardNavigation", BindingFlags.NonPublic | BindingFlags.Static)
        .GetValue(null);

    var method = navigation
        .GetType()
        .GetMethod("GetNextTab", BindingFlags.NonPublic | BindingFlags.Instance);

    return method.Invoke(navigation, new object[] { e, container, goDownOnly }) as DependencyObject;
}

Пример.

var nextElement = GetNextTab(textbox1, window, false);
0 голосов
/ 22 апреля 2011

PredictFocus должен был получить поддержку Tab в .NET 4, но текущий MSDN подразумевает, что это не так. Однако это может быть недосмотр документации; Я не пробовал, но вы могли бы попробовать.

Если это не сработает, на KeyboardNavigation есть приватный метод, который может принести вам пользу; вам придется использовать рефлексию, чтобы вызвать его, и вам понадобятся соответствующие права доступа к коду, но это может сработать. .NET Reflector раскрывает подпись следующим образом:

* * 1010

Где e - элемент, для которого вы хотите получить следующую вкладку, а container - его родительский контейнер. Я не уверен на 100%, что делает goDownOnly, но я предполагаю , что это означает, что вы не хотите покидать родительский контейнер. Метод вернет значение null, если для этого элемента нет следующей вкладки.

Имейте в виду, это частный метод; очень восприимчивы к изменениям в следующей версии.

Редактировать: вам понадобится экземпляр KeyboardNavigation! Полностью забыл об этом. Есть статический в FrameworkElement.KeyboardNavigation, но он также внутренний, так что подумайте, как это сделать.

0 голосов
/ 22 апреля 2011

Я не думаю, что возможно иметь следующий элемент управления в порядке табуляции, но вы можете зациклить дочернюю коллекцию и использовать KeyboardNavigation.GetIsTabStop(..) KeyboardNavigation.GetTabIndex() для создания помощника для thet.

...