有关TabNavigation的方式【项目】

问题

外层MainWindow.xaml里有一个Container(ContentPresenter),调用一个CreateJob 页面,里面是一行行的<TextBlock>,最后一个是<DataPicker>。

因为会调用不同的子页面,这个Containner(ContentPresenter)需要写清TabNavigation的方式,这里是Local

<ContentPresenter KeyboardNavigation.TabNavigation="Local"
                      Grid.Row="2"
                      Content="{Binding CurrentViewModel}">

而里面这些Textblock设置了一定顺序的Index,最后一个是<DataPicker>的index是最大的。

但是这个datapicker是由一个DataTemplate组成的,其再内层是一个TextBlock和一个Button组成。

问题是KeyboardTab不会走到内层的DataPicker的Button中。

解决

1:检查内层DataPicker的DataTemplate的Button有没有设置Focusable= false

2:外层<DataPicker>要是KeyboardNavigation.TabNavigation="Continue"

<DatePicker Grid.Row="5"
                      Grid.Column="1"
                      Margin="10,5,0,5"
                      Focusable="True"
                      KeyboardNavigation.TabIndex="11"
                      KeyboardNavigation.TabNavigation="Continue"
                      Style="{StaticResource Base_DatePicker_Template}"
                      Text="{Binding CurrentJob.RevisionDate, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
                      HorizontalAlignment="Left"
                      />
View Code

给出CreateJob页面空间的内部完整设置:

<TextBox Grid.Column="1"
                   MaxLength="64"
                   Margin="10,5,0,5"
                   KeyboardNavigation.TabIndex="0"
                   Style="{StaticResource Gray_TextBox_Style}"
                   Template="{StaticResource Base_TextBox_Template}"
                   Text="{Binding CurrentJob.Client, UpdateSourceTrigger=PropertyChanged}" />


          <TextBlock Grid.Row="1"
                     Margin="10,5,0,5"
                     HorizontalAlignment="Right"
                     FontSize="18"
                     Style="{StaticResource Univers57_TextBlock_Style}"
                     Text="Field/Lease" />
          <TextBox Grid.Row="1"
                   Grid.Column="1"
                   MaxLength="64"
                   Margin="10,5,0,5"
                   KeyboardNavigation.TabIndex="1"
                   Style="{StaticResource Gray_TextBox_Style}"
                   Template="{StaticResource Base_TextBox_Template}"
                   Text="{Binding CurrentJob.FieldLease, UpdateSourceTrigger=PropertyChanged}" />

          <TextBlock Grid.Row="2"
                     Margin="10,5,0,5"
                     HorizontalAlignment="Right"
                     FontSize="18"
                     Style="{StaticResource Univers57_TextBlock_Style}"
                     Text="Well Name" />
          <TextBox Grid.Row="2"
                   Grid.Column="1"
                   MaxLength="40"
                   Margin="10,5,0,5"
                   KeyboardNavigation.TabIndex="2"
                   Style="{StaticResource Gray_TextBox_Style}"
                   Template="{StaticResource Base_TextBox_Template}"
                   Text="{Binding CurrentJob.WellName, UpdateSourceTrigger=PropertyChanged}" />

          <TextBlock Grid.Row="3"
                     Margin="10,5,0,5"
                     HorizontalAlignment="Right"
                     FontSize="18"
                     Style="{StaticResource Univers57_TextBlock_Style}"
                     Text="Company Rep" />
          <TextBox Grid.Row="3"
                   Grid.Column="1"
                   MaxLength="64"
                   Margin="10,5,0,5"
                   KeyboardNavigation.TabIndex="3"
                   Style="{StaticResource Gray_TextBox_Style}"
                   Template="{StaticResource Base_TextBox_Template}"
                   Text="{Binding CurrentJob.CompanyRep, UpdateSourceTrigger=PropertyChanged}" />

          <TextBlock x:Name="AreaCountryLabel"
                     Grid.Row="4"
                     Margin="10,5,0,5"
                     HorizontalAlignment="Right"
                     FontSize="18"
                     Style="{StaticResource Univers57_TextBlock_Style}"
                     Text="Rig Name" />
          <TextBox Grid.Row="4"
                   Grid.Column="1"
                   MaxLength="64"
                   Margin="10,5,0,5"
                   KeyboardNavigation.TabIndex="4"
                   Style="{StaticResource Gray_TextBox_Style}"
                   Template="{StaticResource Base_TextBox_Template}"
                   Text="{Binding CurrentJob.RigName, UpdateSourceTrigger=PropertyChanged}" />

          <TextBlock Grid.Row="5"
                     Margin="10,5,0,5"
                     HorizontalAlignment="Right"
                     FontSize="18"
                     Style="{StaticResource Univers57_TextBlock_Style}"
                     Text="Rig Type" />
          <TextBox Grid.Row="5"
                   Grid.Column="1"
                   MaxLength="32"
                   Margin="9.999,6.067,0,6.067"
                   KeyboardNavigation.TabIndex="5"
                   Style="{StaticResource Gray_TextBox_Style}"
                   Template="{StaticResource Base_TextBox_Template}"
                   Text="{Binding CurrentJob.RigType, UpdateSourceTrigger=PropertyChanged}" />


        <TextBlock Grid.Row="6"
                     Margin="0,5"
                     HorizontalAlignment="Right"
                     FontSize="18"
                     Style="{StaticResource Univers57_TextBlock_Style}"
                     Text="Rig Phone Number" Width="137.605" />
          <TextBox Grid.Row="6"
                   Grid.Column="1"
                   MaxLength="32"
                   Margin="9.999,6.067,0,6.067"
                   KeyboardNavigation.TabIndex="6"
                   Style="{StaticResource Gray_TextBox_Style}"
                   Template="{StaticResource Base_TextBox_Template}"
                   Text="{Binding CurrentJob.RigPhoneNumber, UpdateSourceTrigger=PropertyChanged}" />

        <TextBlock Grid.Row="7"
                     Margin="0,5"
                     HorizontalAlignment="Right"
                     FontSize="18"
                     Style="{StaticResource Univers57_TextBlock_Style}"
                     Text="Casing Size"/>
          <TextBox Grid.Row="7"
                   Grid.Column="1"
                   MaxLength="32"
                   Margin="9.999,6.067,0,6.067"
                   KeyboardNavigation.TabIndex="7"
                   Style="{StaticResource Gray_TextBox_Style}"
                   Template="{StaticResource Base_TextBox_Template}"
                   Text="{Binding CurrentJob.CasingSize, UpdateSourceTrigger=PropertyChanged}" />
        </Grid>
        <Grid VerticalAlignment="Top" Margin="0,20,60,0" d:LayoutOverrides="Width" Grid.Column="1">
          <Grid.ColumnDefinitions>
            <ColumnDefinition Width="0.3*" />
            <ColumnDefinition Width="0.7*" />
          </Grid.ColumnDefinitions>
          <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
          </Grid.RowDefinitions>
         
         <TextBlock HorizontalAlignment="Right"
                     Margin="10,5,0,5"
                     FontSize="18"
                     Style="{StaticResource Univers57_TextBlock_Style}"
                     Text="Programmed By"  />
          <TextBox Grid.Row="0"
                   Grid.Column="1"
                   MaxLength="32"
                   Margin="10,5,0,5"
                   KeyboardNavigation.TabIndex="8"
                   Style="{StaticResource Gray_TextBox_Style}"
                   Template="{StaticResource Base_TextBox_Template}"
                   Text="{Binding CurrentJob.ProgrammedBy, UpdateSourceTrigger=PropertyChanged}" />
         
         
          <TextBlock Grid.Row="1"
                    FontSize="18"
                    Style="{StaticResource Univers57_TextBlock_Style}"
                     HorizontalAlignment="Right" Margin="10,10,0,5" TextTrimming="CharacterEllipsis" TextWrapping="NoWrap" />
                                    
          <TextBlock Grid.Row="2"
                     HorizontalAlignment="Right"
                     VerticalAlignment="Center"
                     FontSize="18"
                     Margin="10,5,0,5"
                     Style="{StaticResource Univers57_TextBlock_Style}"
                     Text="Sales Order No." />
          <TextBox Grid.Row="2"
                   Grid.Column="1"
                   MaxLength="32"
                   Margin="10,5,0,5"
                   KeyboardNavigation.TabIndex="9"
                   Style="{StaticResource Gray_TextBox_Style}"
                   Template="{StaticResource Base_TextBox_Template}"
                   Text="{Binding CurrentJob.SalesOrderNo, UpdateSourceTrigger=PropertyChanged}" />

        <TextBlock Grid.Row="3"
                     FontSize="18"
                     Style="{StaticResource Univers57_TextBlock_Style}"
                     HorizontalAlignment="Right" Margin="10,10,0,5" />

        <TextBlock Grid.Row="4"
                     HorizontalAlignment="Right"
                     VerticalAlignment="Center"
                     FontSize="18"
                     Margin="10,5,0,5"
                     Style="{StaticResource Univers57_TextBlock_Style}"
                     Text="Revision" />
          <TextBox Grid.Row="4"
                   Grid.Column="1"
                   MaxLength="32"
                   Margin="10,5,0,5"
                   KeyboardNavigation.TabIndex="10"
                   Style="{StaticResource Gray_TextBox_Style}"
                   Template="{StaticResource Base_TextBox_Template}"
                   Text="{Binding CurrentJob.Revision, UpdateSourceTrigger=PropertyChanged}" />

          <TextBlock Grid.Row="5"
                     FontSize="18"
                     Style="{StaticResource Univers57_TextBlock_Style}"
                     Text="Revision Date" HorizontalAlignment="Right" Margin="10,5,0,5" />
                                       
          <DatePicker Grid.Row="5"
                      Grid.Column="1"
                      Margin="10,5,0,5"
                      Focusable="True"
                      KeyboardNavigation.TabIndex="11"
                      KeyboardNavigation.TabNavigation="Continue"
                      Style="{StaticResource Base_DatePicker_Template}"
                      Text="{Binding CurrentJob.RevisionDate, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
                      HorizontalAlignment="Left"
                      />
       
        </Grid>
View Code

下层DataPicker的DT是

<Style x:Key="Base_DatePicker_Template" TargetType="{x:Type DatePicker}">
    <Setter Property="Foreground" Value="Gray"/>
    <Setter Property="IsTodayHighlighted" Value="True"/>
    <Setter Property="SelectedDateFormat" Value="Short"/>
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="Padding" Value="2"/>
    <Setter Property="BorderThickness" Value="1"/>
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="{x:Type DatePicker}">
          <Grid>
            <Grid x:Name="PART_Root"
                  HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
              <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="Auto"/>
              </Grid.ColumnDefinitions>
              <DatePickerTextBox x:Name="PART_TextBox" Height="25" Width="175" Grid.Column="0"
                                 Focusable="{TemplateBinding Focusable}" 
                                 HorizontalContentAlignment="Stretch" Grid.Row="0"
                                 Style="{StaticResource Gray_TextBox_Style}"
                                 Template="{StaticResource Base_TextBox_Template}"
                                 Foreground="#666666" 
                                 VerticalContentAlignment="Center"
                                 Text="{TemplateBinding Text}" 
                                 Padding="3,5,33,5"/>
              <Button x:Name="PART_Button"
                      Width="18" Height="18" 
                      Cursor="Hand" 
                      Grid.Column="1" 
                      Foreground="{TemplateBinding Foreground}" 
                      Focusable="True" 
                      HorizontalAlignment="Right" 
                      Margin="5,0"
                      Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=SelectedDate, Converter={StaticResource DateToDayStringConverter}}"
                      Template="{StaticResource CalenderButton_ControlTemplate}" 
                      />
              <Grid x:Name="PART_DisabledVisual"
                    IsHitTestVisible="False" 
                    Opacity="0">
                <Popup x:Name="PART_Popup" 
                       AllowsTransparency="True" 
                       Placement="Bottom" 
                       PlacementTarget="{Binding ElementName=PART_TextBox}" 
                       StaysOpen="False"/>
              </Grid>
            </Grid>
          </Grid>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
  </Style>
View Code

更多参考:

KeyBoardNavigationMode

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/af39c593-6a9f-4899-88b6-b28016de7d6f

Focus overview:

http://msdn.microsoft.com/en-us/library/aa969768.aspx#Keyboard_Navigation

Unable to focus the Calendar button on DatePicker of wpf toolkit

http://msdn.microsoft.com/en-us/library/system.windows.input.keyboardnavigationmode.aspx

原文地址:https://www.cnblogs.com/shawnzxx/p/3132660.html