Навигация по клавиатуре WPF: как развернуть панель и установить фокус на первом элементе управления этой панели? - PullRequest
1 голос
/ 25 июня 2010

Вроде новичок в WPF, и я работаю над приложением, которое имеет общую форму ввода пользователя и раздел «детали», который скрыт в Expander. Я пытаюсь сделать так, чтобы, если пользователь вкладок в элементе управления расширителем, он автоматически расширялся и фокусировался на первом элементе управления в этом расширителе.

Некоторые урезали XAML:


<StackPanel>
    <Grid>
       <Grid.ColumnDefinitions>
           <ColumnDefinition Width="*"/>
           <ColumnDefinition Width="*"/>
           <ColumnDefinition Width="*"/>
           <ColumnDefinition Width="*"/>
       </Grid.ColumnDefinitions>
       <Grid.RowDefinitions>
           <RowDefinition Height="24"/>
           <RowDefinition Height="24"/>
       </Grid.RowDefinitions>

       <Label Content="Email" Grid.Row="0" Grid.Column="0"/>
       <TextBox Grid.Row="0" Grid.Column="1"/>

       <Label Content="Department" Grid.Row="0" Grid.Column="2"/>
       <TextBox Grid.Row="0" Grid.Column="3"/>

       <Label Content="Contact Name" Grid.Row="1" Grid.Column="0"/>
       <TextBox Grid.Row="1' Grid.Column="1"/>

       <Label Content="Phone Number" Grid.Row="1" Grid.Column="2"/>
       <TextBox Grid.Row="1" Grid.Column="3"/>

    </Grid>

    <Expander ExpandDirection="Down" IsExpanded="False" Header="Details">
          <StackPanel Orientation="Horizontal">
               <Label Content="Address"/>
               <TextBox />
               <Button Content="Add Another" />
          </StackPanel>
    </Expander>
</StackPanel>

Что я хотел бы сделать, так это то, что если пользователь в данный момент вводит номер телефона и нажимает на вкладку «Расширитель сведений», он должен развернуться и поместить фокус в текстовое поле «Адрес». Я попытался установить TabIndex и играть с KeyboardNavigation.Tab ... безуспешно.

Есть идеи, как это сделать?

Ответы [ 2 ]

1 голос
/ 26 июня 2010

Замените ваш Expander следующим XAML, используя EventTrigger и раскадровку:

<Expander ExpandDirection="Down" 
          IsExpanded="False" 
          Header="Details">
  <Expander.Style>
    <Style>
      <Style.Triggers>
        <EventTrigger RoutedEvent="Expander.GotFocus">
          <EventTrigger.Actions>
            <BeginStoryboard>
              <Storyboard>
                <BooleanAnimationUsingKeyFrames
                   Storyboard.TargetProperty="(Expander.IsExpanded)">
                   <DiscreteBooleanKeyFrame
                     KeyTime="00:00:01"
                     Value="True" />
                </BooleanAnimationUsingKeyFrames>
              </Storyboard>
            </BeginStoryboard>
          </EventTrigger.Actions>
        </EventTrigger>
      </Style.Triggers>                            
    </Style>
  </Expander.Style>
  <StackPanel Orientation="Horizontal">
    <Label Content="Address"/>
    <TextBox />
    <Button Content="Add Another" />
  </StackPanel>
</Expander> 
0 голосов
/ 25 июня 2010

Не думаю, что для этого есть чистый Xaml-подход. Возможно, вам придется обработать событие GotFocus расширителя, чтобы 1) развернуть расширитель и 2) вызвать метод Focus () для первого элемента управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...