2010-06-25 19 views
1

WPF新增的一種,我正在開發一個應用程序,該應用程序具有一般用戶輸入表單和隱藏在擴展器中的「詳細信息」部分。我試圖獲取它,以便如果用戶選中擴展器控件,它將自動擴展並將焦點放入該擴展器中的第一個控件。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 ...沒有任何運氣。

任何想法如何做到這一點?

回答

1

與以下使用一個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> 
+0

這很好。謝謝Zamboni。 – Adam 2010-06-26 19:29:38

0

我不認爲這是一種純粹的Xaml方法。您可能需要處理擴展器的GotFocus事件,以便1)展開擴展器,2)調用第一個控件上的Focus()方法。

+0

我嘗試添加一個GotFocus事件的擴展,但是當我使用的MoveFocus它通過重點擴展之外。有關如何將焦點發送到擴展器內控件的任何想法? – Adam 2010-06-25 16:13:47