2010-12-29 3 views
0

Я использую TabControl для отображения списка элементов. Элемент ItemView - это отдельный элемент управления, который я написал.Установите фокус на кнопку в новом TabItem

 <TabControl SelectedItem="{Binding CurrentItem}" 
        IsSynchronizedWithCurrentItem="True" 
        ItemsSource="{Binding ItemList}"> 
      <TabControl.ContentTemplate> 
       <DataTemplate> 
        <ctrls:ItemView/> 
       </DataTemplate> 
      </TabControl.ContentTemplate> 
      <TabControl.ItemTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding ShortItemDescription}"/> 
       </DataTemplate> 
      </TabControl.ItemTemplate> 
     </TabControl> 

Если пользователь нажимает на кнопку новый ViewModel добавляется в список ViewModels и TabControl отображает его в новой вкладке. После добавления новой вкладки.

 <Button Command="{Binding AddItemCommand}" 
       Content="Add item"/> 

Внутри нового вида кнопка, которая должна быть сфокусирована каждый раз при добавлении новой вкладки. Я попытался использовать FocusManager и инициализированное событие в ItemView, но они вызываются только в первый раз, когда я добавляю новую вкладку.

<UserControl x:Class="ItemView" 
     ... 
     Initialized="ViewInitialized"> 
<Grid> 
    ... 

    <!-- Set focus to this button --> 
    <Button Content="Search" 
      Command="{Binding SearchCommand}" 
      Name="SearchButton" 
      Grid.Column="0" 
      Grid.Row="0"/> 
</Grid> 
</UserControl> 

Любые идеи?

Update

Содержание метода Initialize в ItemView в настоящее время это один - который работает отлично ... в первый раз, а затем никогда

public delegate void ChangeFocusDelegate(); 

    private void FocusSearchButton() 
    { 
     SearchButton.Focus(); 
    } 

    private void ViewInitialized(object sender, EventArgs e) 
    { 
     ChangeFocusDelegate focusDelegate = FocusSearchButton; 
     Dispatcher.BeginInvoke(DispatcherPriority.ContextIdle, focusDelegate); 
    } 
+0

Я думаю, что вы имели в виду просмотр, когда вы написали ViewModel. Самое простое решение - обработать событие «tab_page _added» в коде, где задано фокус на кнопке – Arseny

+0

Вы были правы - я изменил его. Есть ли событие tab_page_added? Я не нашел ничего подобного. Это было бы решением, если что-то подобное существует ... – Jan

ответ

1

Это должен работать так (по вашему определенному Инициализированному событию UserControl):

private void ViewInitialized(object sender, System.EventArgs e) 
{ 
    this.SearchButton.Focus(); 
} 
+0

Как я описал выше ... Инициализированный метод только один раз называется! И даже тогда вы почти никогда не работаете :(Я продлю свой пост. – Jan

0

Вам необходимо подписаться на событие Loaded на вашем экране, а в методе обработчика события вызовите Focus() на вашей кнопке.

+0

Я пробовал это. Тот же результат - однажды вызванный, никогда больше. – Jan

+0

Попробуйте подписаться на событие IsVisibleChanged и в обработчике событий, если IsVisible is true, вызовите Focus() на вашу кнопку. –

+0

Вы дали мне подсказку, чтобы решить загадку ... – Jan

0

Казалось укусил немного странно ...
IsVisibleChanged ... нет реакции
инициализируется ... нет реакции
Loaded ... нет реакции

А потом я получил решение. Что делать, если среда выполнения использует один и тот же вид для каждой вкладки и изменяет только данные внутри другого ViewModel. Таким образом, решение таково:

private void SameViewButDataContextChanged(object sender, System.Windows.DependencyPropertyChangedEventArgs e) 
    { 
     ChangeFocusDelegate focusDelegate = FocusFileSearchButton; 
     Dispatcher.BeginInvoke(DispatcherPriority.ContextIdle, focusDelegate); 
    } 

И каждый раз, когда я добавляю вкладку, фокус переключается на кнопку поиска.

Смежные вопросы