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

时间:2010-06-25 15:02:15

标签: wpf

WPF的新手,我正在开发一个具有一般用户输入表单和隐藏在Expander中的“详细信息”部分的应用程序。我试图得到它,以便如果用户Tabs进入扩展器控件它将自动扩展并将焦点放入该扩展器中的第一个控件。

有些人剥夺了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 个答案:

答案 0 :(得分:1)

使用EventTrigger和Storyboard将以下XAML替换为Expander:

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

答案 1 :(得分:0)

我认为没有纯粹的Xaml方法。您可能必须处理扩展器的GotFocus事件以1)扩展扩展器,以及2)在第一个控件上调用Focus()方法。