0

我的 WPF 应用程序中有一个搜索屏幕。屏幕实现为 TabControl 的 TabItem 中的 UserControl。当用户切换到“搜索”选项卡时,我希望焦点进入一个特定字段。我在这里问了一个关于如何确定焦点的问题。我现在知道它要去哪里了。现在我想弄清楚它为什么会去那里,这样我就可以阻止它。

请注意,焦点是自发变化的,与任何用户活动无关。用户所做的只是单击主窗口中的搜索选项卡。焦点应该转到这个特定的文本框;这是在 UserControl 的 Loaded 事件处理程序中完成的。它最初确实转到了那个 TextBox。然后,由于某种原因,它转到 CheckBox。

我已经为表单上的 TabIndex 控件分配了值,用户可以与之交互。CheckBox 位于 TabIndex 1。有问题的 TextBox 位于 TabIndex 9。这也是表单上唯一的 TextBox。

过去,焦点会移动到 TextBox 并停留在那里。不知不觉中,我更改了一些导致焦点转到 CheckBox 的内容。我不知道我改变了什么,除了大约是在我将 Telerik 控件库升级到最新版本的时候。

这是整个控件的 Xaml,减去一些无关紧要的东西:

<UserControl x:Class="CarSystem.CustomControls.Searcher"
         <!-- XML Namespaces removed for brevity -->
         Height="620"
         Loaded="UserControl_Loaded"
         Width="990">

<UserControl.Resources>
    <!--- Resource removed for brevity -->
</UserControl.Resources>

<Grid Background="{DynamicResource ContentBackground}"
      FocusManager.IsFocusScope="True"
      Name="LayoutRoot">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="110" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <Grid Grid.Column="0"
          Grid.Row="0">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>

        <GroupBox BorderBrush="{DynamicResource ControlBorder}"
                  FontSize="16"
                  FontWeight="Bold"
                  Foreground="{DynamicResource TextForeground}"
                  Grid.Column="0"
                  Grid.Row="0"
                  Header="Alarm Class:"
                  Margin="5,0">
            <Grid VerticalAlignment="Center">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="Auto" />
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="35" />
                    <RowDefinition Height="*" />
                </Grid.RowDefinitions>
                <CheckBox Click="AllAlarmClasses_Click"
                          Content="ALL"
                          FontSize="14"
                          FontWeight="Bold"
                          Grid.Column="0"
                          Grid.Row="0"
                          HorizontalAlignment="Left"
                          Margin="5"
                          Name="AllAlarmClasses"
                          TabIndex="1"
                          VerticalAlignment="Center" />
                <Button Background="{DynamicResource ButtonBackground}"
                        Click="ExpandPicker_Click"
                        Content="Expand"
                        FontSize="14"
                        FontWeight="Bold"
                        Grid.Column="1"
                        Grid.Row="0"
                        Foreground="{DynamicResource ButtonForeground}"
                        Margin="5"
                        Name="ExpandAlarmClass"
                        TabIndex="2" />
                <ListBox BorderBrush="Black"
                         BorderThickness="1"
                         CheckBox.Click="AlarmClassPicker_Click"
                         ItemTemplate="{StaticResource CheckableChoice}"
                         FontSize="14"
                         FontWeight="Bold"
                         Grid.Column="0"
                         Grid.ColumnSpan="2"
                         Grid.Row="1"
                         Height="100"
                         ItemsSource="{Binding Path=AlarmClassChoices, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}, Mode=TwoWay}"
                         Margin="5,0"
                         Name="AlarmClassPicker"
                         SelectionMode="Multiple"
                         TabIndex="3"
                         Visibility="Collapsed" />
            </Grid>
        </GroupBox>

        <GroupBox BorderBrush="{DynamicResource ControlBorder}"
                  FontSize="16"
                  FontWeight="Bold"
                  Foreground="{DynamicResource TextForeground}"
                  Grid.Column="0"
                  Grid.Row="1"
                  Header="Source:"
                  Margin="5,0">
            <cs:TouchComboBox Background="{DynamicResource UnfocusedBackground}"
                              BorderBrush="{DynamicResource ControlBorder}"
                              FontSize="14"
                              FontWeight="Bold"
                              Foreground="{DynamicResource UnfocusedForeground}"
                              GridBackground="{DynamicResource ContentBackground}"
                              Height="50"
                              IsTabStop="True"
                              ItemsSource="{Binding Path=HotListChoices, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}, Mode=TwoWay}"
                              Margin="5,0"
                              x:Name="HotListPicker"
                              SelectionChanged="SourcePicker_SelectionChanged"
                              TabIndex="4"
                              TimeOfDayMode="{Binding Path=TimeOfDayMode, RelativeSource={RelativeSource AncestorType={x:Type cs:Searcher}}}"
                              VerticalAlignment="Top" />
        </GroupBox>
        <GroupBox BorderBrush="{DynamicResource ControlBorder}"
                  FontSize="16"
                  FontWeight="Bold"
                  Foreground="{DynamicResource TextForeground}"
                  Grid.Column="1"
                  Grid.Row="0"
                  Header="Start Date:"
                  Margin="5,0">
            <telerik:RadDateTimePicker FontWeight="Bold"
                                       Height="35"
                                       Margin="5"
                                       Name="StartDatePicker"
                                       SelectionChanged="DateTimePicker_SelectionChanged"
                                       Style="{DynamicResource RadDateTimePickerControlTemplate1}"
                                       TabIndex="5"
                                       VerticalAlignment="Center" />
        </GroupBox>
        <GroupBox BorderBrush="{DynamicResource ControlBorder}"
                  FontSize="16"
                  FontWeight="Bold"
                  Foreground="{DynamicResource TextForeground}"
                  Grid.Column="1"
                  Grid.Row="1"
                  Header="End Date:"
                  Margin="5,0">
            <telerik:RadDateTimePicker FontSize="14"
                                       FontWeight="Bold"
                                       Height="35"
                                       Margin="5"
                                       Name="EndDatePicker"
                                       SelectionChanged="DateTimePicker_SelectionChanged"
                                       Style="{DynamicResource RadDateTimePickerControlTemplate1}"
                                       TabIndex="6"
                                       VerticalAlignment="Center" />
        </GroupBox>

        <GroupBox BorderBrush="{DynamicResource ControlBorder}"
                  FontSize="16"
                  FontWeight="Bold"
                  Foreground="{DynamicResource TextForeground}"
                  Grid.Column="2"
                  Grid.Row="0"
                  Header="State:"
                  Margin="5,0">
            <cs:TouchComboBox Background="{DynamicResource UnfocusedBackground}"
                              BorderBrush="{DynamicResource ControlBorder}"
                              DisplayMemberPath="Value"
                              FontSize="14"
                              FontWeight="Bold"
                              Foreground="{DynamicResource UnfocusedForeground}"
                              GridBackground="{DynamicResource ContentBackground}"
                              Height="50"
                              ItemsSource="{Binding Path=LocaleChoices, Mode=TwoWay, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
                              Margin="5"
                              x:Name="StatePicker"
                              SelectedValue="{Binding Path=LocaleCode}"
                              SelectedValuePath="Key"
                              SelectionChanged="StatePicker_SelectionChanged"
                              TabIndex="7"
                              TimeOfDayMode="{Binding Path=TimeOfDayMode, RelativeSource={RelativeSource AncestorType={x:Type cs:Searcher}}}"
                              VerticalAlignment="Center" />
        </GroupBox>
        <GroupBox BorderBrush="{DynamicResource ControlBorder}"
                  FontSize="16"
                  FontWeight="Bold"
                  Foreground="{DynamicResource TextForeground}"
                  Grid.Column="2"
                  Grid.Row="1"
                  Header="Plate:"
                  Margin="5,0">
            <Border BorderBrush="{DynamicResource ControlBorder}"
                    BorderThickness="1"
                    Height="35"
                    Margin="5"
                    VerticalAlignment="Center">
                <TextBox FontSize="14"
                         FontWeight="Bold"
                         GotFocus="PlateBox_GotFocus"
                         LostFocus="PlateBox_LostFocus"
                         Margin="-1"
                         MaxLength="25"
                         MaxLines="1"
                         Name="PlateBox"
                         TabIndex="8"
                         Text="{Binding Path=Plate, Mode=TwoWay}"
                         TextChanged="PlateBox_TextChanged"
                         ToolTip='Wildcards ("%", "_", "[", "]") can be used' />
            </Border>
        </GroupBox>
    </Grid>

    <TabControl Background="{DynamicResource TabBackground}"
                Grid.Row="1"
                Margin="0,20,0,5"
                Name="ResultTabs"
                TabIndex="9">

        <TabItem Background="{DynamicResource TabHeaderBackground}"
                 FontSize="16"
                 FontWeight="Bold"
                 Foreground="{DynamicResource TabHeaderForeground}"
                 Header="Hot List Entries:"
                 Name="HotListEntryTab">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="*" />
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>

                <telerik:RadGridView AutoExpandGroups="True"
                                     AutoGenerateColumns="False"
                                     CanUserDeleteRows="False"
                                     CanUserFreezeColumns="False"
                                     CanUserInsertRows="False"
                                     CanUserResizeColumns="True"
                                     CanUserSortColumns="True"
                                     EnableColumnVirtualization="True"
                                     EnableRowVirtualization="True"
                                     FontSize="14"
                                     FontWeight="Bold"
                                     IsReadOnly="True"
                                     Name="HotListEntriesGrid"
                                     SelectionChanged="HotListEntriesGrid_SelectionChanged"
                                     SelectionUnit="FullRow"
                                     ScrollViewer.CanContentScroll="True"
                                     ScrollViewer.HorizontalScrollBarVisibility="Auto"
                                     ScrollViewer.VerticalScrollBarVisibility="Auto"
                                     TabIndex="10"
                                     ToolTip="Matching Hot List Entries">
                    <telerik:RadGridView.Columns>
                        <telerik:GridViewDataColumn DataMemberBinding="{Binding Plate,        Mode=OneWay}"
                                                    Header="Plate"
                                                    Width="*" />
                        <telerik:GridViewDataColumn DataMemberBinding="{Binding LocaleCode, Mode=OneWay}"
                                                    Header="State"
                                                    Width="75" />
                        <telerik:GridViewDataColumn DataMemberBinding="{Binding ListName,   Mode=OneWay}"
                                                    Header="Source"
                                                    Width="150" />
                        <telerik:GridViewDataColumn DataMemberBinding="{Binding AlarmClass, Mode=OneWay}"
                                                    Header="Alarm Class"
                                                    Width="150" />
                        <telerik:GridViewDataColumn DataMemberBinding="{Binding Notes,     Mode=OneWay}"
                                                    Header="Notes"
                                                    Width="*" />
                    </telerik:RadGridView.Columns>
                </telerik:RadGridView>
                <cs:ProgressControl FontSize="14"
                                    FontWeight="Bold"
                                    Grid.Column="0"
                                    Grid.Row="1"
                                    Height="55"
                                    Margin="0,5"
                                    x:Name="HotListProgressCtrl"
                                    TabIndex="11"
                                    TimeOfDayMode="{Binding Path=TimeOfDayMode, RelativeSource={RelativeSource AncestorType={x:Type cs:Searcher}}}"
                                    Visibility="Collapsed" />
            </Grid>
        </TabItem>

        <TabItem Background="{DynamicResource TabHeaderBackground}"
                 FontSize="16"
                 FontWeight="Bold"
                 Foreground="{DynamicResource TabHeaderForeground}"
                 Header="Reads &amp; Alarms:"
                 IsSelected="True"
                 Name="ReadsTabItem">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="*" />
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>

                <telerik:RadGridView AutoExpandGroups="True"
                                     AutoGenerateColumns="False"
                                     CanUserDeleteRows="False"
                                     CanUserFreezeColumns="False"
                                     CanUserInsertRows="False"
                                     CanUserResizeColumns="True"
                                     CanUserSortColumns="True"
                                     EnableColumnVirtualization="True"
                                     EnableRowVirtualization="True"
                                     FontSize="14"
                                     FontWeight="Bold"
                                     IsReadOnly="True"
                                     Name="ReadsGrid"
                                     RowDetailsTemplate="{StaticResource ReadRowDetailsTemplate}"
                                     RowStyleSelector="{StaticResource StyleSelector}"
                                     SelectionChanged="ReadsGrid_SelectionChanged"
                                     SelectionUnit="FullRow"
                                     ScrollViewer.CanContentScroll="True"
                                     ScrollViewer.HorizontalScrollBarVisibility="Auto"
                                     ScrollViewer.VerticalScrollBarVisibility="Auto"
                                     ShowGroupFooters="True"
                                     TabIndex="12"
                                     ToolTip="Matching Reads">
                    <telerik:RadGridView.Columns>
                        <cs:CustomGridViewToggleRowDetailsColumn IsEnabled="False"
                                                                 IsFilterable="False"
                                                                 IsGroupable="False"
                                                                 ToggleButtonVisibility="{Binding Path=HasAlarms, Converter={StaticResource BoolToVisibility}}" />
                        <telerik:GridViewDataColumn DataMemberBinding="{Binding Plate,       Mode=OneWay}"
                                                    Header="Plate"
                                                    Width="*" />
                        <telerik:GridViewDataColumn DataMemberBinding="{Binding State,       Mode=OneWay}"
                                                    Header="State"
                                                    Width="75" />
                        <telerik:GridViewDataColumn DataMemberBinding="{Binding TimeStamp,  Mode=OneWay, Converter={StaticResource DateConverter}}"
                                                    Header="Date &amp; Time"
                                                    Width="150" />
                        <telerik:GridViewDataColumn DataMemberBinding="{Binding Latitude, Converter={StaticResource CoordConverter}, ConverterParameter=NS}"
                                                    Header="Latitude"
                                                    Width="150" />
                        <telerik:GridViewDataColumn DataMemberBinding="{Binding Longitude, Converter={StaticResource CoordConverter}, ConverterParameter=EW}"
                                                    Header="Longitude"
                                                    Width="150" />
                    </telerik:RadGridView.Columns>
                </telerik:RadGridView>
                <cs:ProgressControl FontSize="14"
                                    FontWeight="Bold"
                                    Grid.Row="1"
                                    Height="55"
                                    Margin="0,5"
                                    x:Name="ProgressCtrl"
                                    TabIndex="13"
                                    TimeOfDayMode="{Binding Path=TimeOfDayMode, RelativeSource={RelativeSource AncestorType={x:Type cs:Searcher}}}"
                                    Visibility="Collapsed" />
            </Grid>
        </TabItem>
    </TabControl>

    <GridSplitter Background="{DynamicResource SeparatorColor}"
                  Grid.Row="1"
                  Height="10"
                  HorizontalAlignment="Stretch"
                  Margin="0,5"
                  VerticalAlignment="Top" />

    <Grid Grid.Column="1"
          Grid.RowSpan="2">
        <Grid.RowDefinitions>
            <RowDefinition Height="55" />
            <RowDefinition Height="55" />
            <RowDefinition Height="55" />
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
            <RowDefinition Height="55" />
            <RowDefinition Height="55" />
        </Grid.RowDefinitions>
        <Button Background="{DynamicResource ButtonBackground}"
                Click="SearchButton_Click"
                Content="Search"
                FontSize="16"
                FontWeight="Bold"
                Foreground="{DynamicResource ButtonForeground}"
                Grid.Row="0"
                IsDefault="True"
                Margin="5"
                Name="SearchButton"
                TabIndex="14" />
        <Button Background="{DynamicResource ButtonBackground}"
                Click="ClearButton_Click"
                Content="Clear"
                FontSize="16"
                FontWeight="Bold"
                Foreground="{DynamicResource ButtonForeground}"
                Grid.Row="1"
                Margin="5"
                Name="ClearButton"
                TabIndex="15" />
        <Button Background="{DynamicResource ButtonBackground}"
                Click="SaveCriteriaButton_Click"
                FontSize="16"
                FontWeight="Bold"
                Grid.Row="2"
                Foreground="{DynamicResource ButtonForeground}"
                Margin="5"
                Name="SaveCriteriaButton"
                TabIndex="16"
                Visibility="Visible">
            <Button.Content>
                <TextBlock Text="Save Report"
                           TextAlignment="Center"
                           TextWrapping="Wrap" />
            </Button.Content>
        </Button>
        <TextBlock FontSize="14"
                   FontWeight="Bold"
                   Foreground="{DynamicResource TextForeground}"
                   Grid.Row="4"
                   Margin="5"
                   Text="Number of Matches:"
                   TextAlignment="Center"
                   TextWrapping="Wrap" />
        <TextBlock FontSize="14"
                   FontWeight="Bold"
                   Foreground="{DynamicResource TextForeground}"
                   Grid.Row="5"
                   Margin="5"
                   Text="Hot List Entries:"
                   TextAlignment="Center"
                   TextWrapping="Wrap" />
        <TextBlock FontSize="14"
                   FontWeight="Bold"
                   Foreground="{DynamicResource TextForeground}"
                   Grid.Row="6"
                   Margin="5,0,5,10"
                   Text="{Binding Converter={StaticResource LongConverter}, ConverterParameter='#,##0', Path=NoHotListEntries, RelativeSource={RelativeSource AncestorType={x:Type cs:Searcher}}}"
                   TextAlignment="Center"
                   TextWrapping="Wrap" />
        <TextBlock FontSize="14"
                   FontWeight="Bold"
                   Foreground="{DynamicResource TextForeground}"
                   Grid.Row="7"
                   Margin="5"
                   Text="Reads:"
                   TextAlignment="Center"
                   TextWrapping="Wrap" />
        <TextBlock FontSize="14"
                   FontWeight="Bold"
                   Foreground="{DynamicResource TextForeground}"
                   Grid.Row="8"
                   Margin="5,0,5,10"
                   Text="{Binding Converter={StaticResource LongConverter}, ConverterParameter='#,##0', Path=NoReads, RelativeSource={RelativeSource AncestorType={x:Type cs:Searcher}}}"
                   TextAlignment="Center"
                   TextWrapping="Wrap" />
        <Button Background="{DynamicResource ButtonBackground}"
                Click="ExportButton_Click"
                Content="Export"
                FontSize="16"
                FontWeight="Bold"
                Foreground="{DynamicResource ButtonForeground}"
                Grid.Row="10"
                Margin="5"
                Name="ExportButton"
                TabIndex="17" />
        <Button Background="{DynamicResource ButtonBackground}"
                Click="CloseButtonClicked"
                Content="Close"
                FontSize="20"
                FontWeight="Bold"
                Foreground="{DynamicResource ButtonForeground}"
                Grid.Row="11"
                HorizontalAlignment="Right"
                Margin="5"
                Name="CloseButton"
                TabIndex="18"
                Width="100" />
    </Grid>

    <Canvas Grid.Column="0"
            Grid.ColumnSpan="2"
            Grid.Row="0"
            Grid.RowSpan="4"
            Name="KeyboardPopupCanvas">
        <cs:KeyboardPopup x:Name="KeyboardPopup"
                          TimeOfDayMode="{Binding Path=TimeOfDayMode, RelativeSource={RelativeSource AncestorType={x:Type cs:Searcher}}}"
                          Title="Keyboard"
                          Visibility="Collapsed" />
    </Canvas>

</Grid>

谢谢你的帮助

托尼

4

1 回答 1

2

只是为了让稍后查看此问题的人知道,我采用的解决方案是重新排列表单上的字段,以便我最初希望获得焦点的字段是表单上的第一个字段。WPF 自动将焦点赋予具有最低 TabIndex 的控件。这就是为什么我将控件放在 Loaded 事件处理程序中之后失去焦点的原因。

我想如果我在 Xaml 中没有任何 TabIndex 字段设置器,这将永远不会发生。活到老,学到老。

于 2012-03-30T17:57:42.207 回答