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

WPF键盘导航:如何展开面板并将焦点放在该面板的第一个控件中?,wpf,Wpf,对WPF来说有点陌生,我正在开发一个应用程序,它有一个通用的用户输入表单和一个隐藏在扩展器中的“细节”部分。我试图得到它,这样,如果用户标签进入扩展器控件,它将自动展开,并将焦点放入扩展器中的第一个控件 一些简化了XAML: <StackPanel> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> <

对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>



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

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

使用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> 

使用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> 


我尝试将GotFocus事件添加到扩展器中,但当我使用MoveFocus时,它将焦点传递到扩展器之外。有没有想过如何将焦点发送到扩展器内的控件?我尝试向扩展器添加一个GotFocus事件,但当我使用MoveFocus时,它将焦点传递到扩展器外。关于如何将焦点发送到扩展器内的控件有什么想法吗?