Установить фокус на кнопку в новом TabItem - PullRequest
0 голосов
/ 29 декабря 2010

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

       <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 добавляется в список ViewModel, а TabControl отображает ее как новую вкладку.После добавления будет выбрана новая вкладка.

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

Внутри нового представления находится кнопка, на которую нужно фокусироваться при каждом добавлении новой вкладки.Я попытался использовать FocusManager и событие Initialized в 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>

Есть идеи?

Обновление

Содержимое метода 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);
    }

Ответы [ 3 ]

1 голос
/ 29 декабря 2010

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

private void ViewInitialized(object sender, System.EventArgs e)
{
    this.SearchButton.Focus();
}
0 голосов
/ 30 декабря 2010

Это казалось немного странным ...
IsVisibleChanged ... нет реакции
Инициализирован ... нет реакции
Загружен ... нет реакции

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

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

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

0 голосов
/ 29 декабря 2010

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

...