WPF Grid и фокус элементов управления внутри него - PullRequest
0 голосов
/ 21 марта 2012

У меня есть MyContainer Пользовательский элемент управления с сеткой внутри.Каждая ячейка этой таблицы содержит некоторый элемент управления, полученный из класса MyControlBase .Эти элементы управления добавляются динамически.

Мне нужно реализовать связанное свойство FocusedControl в MyContainer , чтобы получить текущий фокус или установить фокус на любой из MyControlBase дети.Я знаю о FocusManager.FocusedElement , но не знаю, как правильно его реализовать.

Ответы [ 2 ]

0 голосов
/ 23 марта 2012

ОК, я нашел, как это сделать сам.

Сначала определим наше новое свойство зависимости FocusedAdapterProperty как обычно:

    public static readonly DependencyProperty FocusedAdapterProperty;

    static SpreadGridControl()
    {
        FocusedAdapterProperty = DependencyProperty.Register("FocusedAdapter",
                            typeof(object), typeof(SpreadGridControl),
                            new FrameworkPropertyMetadata(null, null));
    }

    public object FocusedAdapter
    {
        get { return GetValue(FocusedAdapterProperty); }
        set { SetValue(FocusedAdapterProperty, value); }
    }

Затем добавим обработчик GotFocus в родительский контейнер, например <Grid GotFocus="Grid_OnGotFocus">
Проверьте e.OriginalSource и найдите наиболее распространенного предка требуемого типа и установите для свойства новое значение:

    private void Grid_OnGotFocus(object sender, RoutedEventArgs e)
    {
        var control = UIHelpers.TryFindParent<ControlBase>
            ((DependencyObject)e.OriginalSource);
        if (control != null)
            FocusedAdapter = control.Adapter;
    }

Реализация TryFindParent можетможно найти здесь

0 голосов
/ 21 марта 2012

Не знаю, поможет ли это вашей ситуации, или если это даже правильный путь для моей, но в крайнем случае я обнаружил, что прослушивание события Loaded на объекте, который я хочу сфокусировать, и затем использование Dispatcher.BeginInvoke отправьте запрос Focus на мой элемент управления с приоритетом Background или ApplicationIdle, если другие методы этого не сделали. Например:

private void MyControlLoaded(object sender, RoutedEventArgs e)
{
    Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, new Action( () => MyControl.Focus() ));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...