【问题标题】:How to TAB through TextBoxes in a ListView如何在 ListView 中通过文本框进行 TAB
【发布时间】:2011-09-18 23:27:33
【问题描述】:

好的,我有一个 ListView,它有 2 个 GridViewColumns,一个显示一个数字,一个包含一个 TextBox 我的问题是我希望能够通过 GridViewColumn 中的所有 TextBox 进行 Tab。 通过附加的 Property KeyboardNavigation.TabNavigation,我几乎实现了我想要的。
我实现的是:
第一个 TAB - 整个第一个 ListViewItem 聚焦
第二个 TAB - 第一个 TextBox 聚焦
第三个 TAB - 整个第二个 ListViewItem 集中
第四个 TAB - 第二个 TextBox 焦点

我想要的是
第一个 TAB - 第一个 TextBox 焦点
第二个 TAB - 第二个 TextBox 聚焦

    <ListView KeyboardNavigation.TabNavigation="Continue" Name="TheLabelListView" >
                            <ListView.ItemContainerStyle >
                                    <EventSetter Event="Selected" Handler="ItemSelected" /></Style>
                            </ListView.ItemContainerStyle>
                            <ListView.View>
                                <GridView x:Name="GridViewSmall"  >
                                    <GridViewColumn  Header="#" Width="20"  DisplayMemberBinding="{Binding SelectorIndexNumber}" />
                                    <GridViewColumn  Header="Selector" Width="175">
                                        <GridViewColumn.CellTemplate>
                                            <DataTemplate>
                                                <TextBox Name="SelectorTextBox"  Text="{Binding SelectorName}"  />                                                    
                                            </DataTemplate>
                                        </GridViewColumn.CellTemplate>
                                    </GridViewColumn>
                                </GridView>
                            </ListView.View>
                        </ListView>

此代码是 H.B. 给我的。 .它应该在选择 ListViewÍtem 并找到 TextBox 并将其聚焦时执行。不知何故,它仍然不会每次都选择 TextBox,尽管执行此方法时 bool TextBoxgotFocus 始终为 true。

 private void ItemSelected(object sender, RoutedEventArgs e)
    {
        var item = sender as ListViewItem;
        TextBox h = (FindNamedChild(item, "SelectorTextBox") as TextBox);
        bool TextBoxgotFocus = h.Focus();
    }

    public static object FindNamedChild(DependencyObject container, string name)
    {
        if (container is FrameworkElement)
        {
            if ((container as FrameworkElement).Name == name) return container;
        }
        var ccount = VisualTreeHelper.GetChildrenCount(container);
        for (int i = 0; i < ccount; i++)
        {
            var child = VisualTreeHelper.GetChild(container, i);
            var target = FindNamedChild(child, name);
            if (target != null)
            {
                return target;
            }
        }
        return null;
    }

【问题讨论】:

    标签: c# wpf listview textbox


    【解决方案1】:

    问题在于,对于列表视图中的每个项目,您都有两个制表位:项目本身和文本框。您想将项目本身的KeyboardNavigation.IsTabStop 设置为false。只需将其设置为您的项目样式即可。

    <ListView KeyboardNavigation.TabNavigation="Continue" Name="TheLabelListView">
        <ListView.ItemContainerStyle>
            <Style>
                <Setter Property="KeyboardNavigation.IsTabStop" Value="False" />
            </Style>
        </ListView.ItemContainerStyle>
    
        <!-- etc... -->
    </ListView>
    

    【讨论】:

    • 我最近遇到了完全相同的问题。但你的回答没有帮助。我发现没有文本框的 listView 项目(其中没有 tabStops)会破坏整个 listView 选项卡导航。换句话说,只有当每个列表项内部至少有一个制表位时,一切都是可以的,在这种情况下——是的——你只需要为项目容器设置 no 制表位就可以很好地完成它。但是如果某些项目的行为像标题怎么办?请帮忙。
    猜你喜欢
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 2011-01-01
    • 2020-09-04
    • 1970-01-01
    相关资源
    最近更新 更多