【发布时间】: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;
}
【问题讨论】: