代码之家  ›  专栏  ›  技术社区  ›  Adam

WPF键盘导航:如何展开面板并将焦点放在该面板的第一个控件中?

wpf
  •  1
  • Adam  · 技术社区  · 16 年前

    对WPF来说有点陌生,我正在开发一个应用程序,它有一个通用的用户输入表单和一个隐藏在扩展器中的“细节”部分。我试图得到它,这样,如果用户进入扩展控制标签,它将自动展开,并把焦点放在第一个控制在该扩展。

    一些剥离了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 回复  |  直到 16 年前
        1
  •  1
  •   Zamboni    16 年前

    使用EventTrigger和情节提要将扩展器替换为以下XAML:

    <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> 
    
        2
  •  0
  •   SergioL    16 年前

    我不认为有一个纯粹的Xaml方法可以解决这个问题。您可能需要处理扩展器的GotFocus事件,1)展开扩展器,2)在第一个控件上调用Focus()方法。