Звучит как сложный вопрос ... позвольте мне объяснить ...

У меня есть treeView. Когда нажимается / выбирается treeViewItem, я хотел бы, чтобы фокус был на другом TextBox.

Проблема в том, что как только я добавляю код для Focus the Textbox, похоже, что TreeView больше не показывает свой выбранный узел (т.е. treeItem вообще не выбран (или, по крайней мере, не виден)).

Вот мой код обработки событий ...

    private void trvTree_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
    {
        grpEditTreeItem.DataContext = (TreeItemDefinition)e.NewValue;


        txtToken.SelectAll();
        txtToken.Focus();
    }

Любые идеи?

0
willem 20 Июл 2009 в 13:56
Пожалуйста, предоставьте более подробную информацию ...
 – 
Prashant Cholachagudda
20 Июл 2009 в 14:04

2 ответа

Лучший ответ

Различайте избранные и целенаправленные. Вы не можете одновременно сфокусировать более одного элемента управления.

Вам нужно, чтобы TreeView Показывал выбранный узел, когда он потерял фокус.

Изменить:
Но я могу подтвердить проблему, установив фокус на другой элемент управления внутри SelectedItemChanged (), чтобы отменить выбор.

Итак, вам нужно что-то, чтобы отложить вызов Focus (). Грубое (но не идеальное) решение - поместить txtToken.Focus () в обработчик события trvTree_MouseUp (). Но это также уберет фокус, например, при расширении узла.

Поэтому вам, вероятно, придется использовать однократный таймер, запускаемый из SelectedItemChanged ().

1
Henk Holterman 20 Июл 2009 в 14:52
Вы также можете поставить вызов фокуса в очередь диспетчера. В наши дни я почти использую это по умолчанию, так как таким образом он не мешает текущему фрейму выполнения, и кажется, что в 90% случаев он делает то, что вы хотите в данной ситуации.
 – 
flq
15 Фев 2013 в 18:44
this.Dispatcher.BeginInvoke((Action)delegate
{
    txtToken.SelectAll();
    txtToken.Focus();
});
0
Oleg Mihailik 21 Июл 2009 в 05:03