2011-09-18 12 views
17

Ok Tôi có một ListView có 2 GridViewColumns hiển thị một số và một chứa một TextBox Vấn đề của tôi là tôi muốn có thể Tab thông qua tất cả các TextBoxes tôi có trong GridViewColumn. Với Bàn phím thuộc tính đính kèmNavigation.TabNavigation tôi đạt được hầu hết những gì tôi muốn.
gì tôi đạt được là:
TAB đầu tiên - toàn ListViewItem đầu tiên tập trung
TAB thứ hai - TextBox đầu tiên tập trung
TAB thứ ba - cả ListViewItem thứ hai tập trung
TAB thứ tư - TextBox thứ hai tập trung
Làm thế nào để TAB thông qua TextBox trong một ListView

gì tôi muốn là
TAB đầu tiên - Hộp văn bản đầu tiên tập trung
TAB thứ hai - Hộp văn bản thứ hai tập trung

<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> 

Mã này được cung cấp cho tôi bởi H.B. . Nó được cho là để thực hiện khi một ListViewÍtem được chọn và tìm thấy TextBox và tập trung nó. Bằng cách nào đó nó vẫn không chọn TextBox mọi lúc mọi nơi khi phương pháp này được thực thi bool TextBoxgotFocus luôn đúng.

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; 
    } 

Trả lời

27

Vấn đề là đối với mỗi mục trong chế độ xem danh sách, bạn có hai điểm dừng tab: chính mục đó và hộp văn bản. Bạn muốn đặt KeyboardNavigation.IsTabStop thành false cho các mục. Chỉ cần đặt nó trong phong cách của mục của bạn.

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

    <!-- etc... --> 
</ListView> 
+0

Cảm ơn bạn. Thats nó chính xác –

+0

Gần đây tôi đã phải đối mặt chính xác cùng một vấn đề. Nhưng câu trả lời của bạn không giúp được gì. Tôi đã phát hiện ra rằng listView mục không có hộp văn bản (không có tabStops trong chúng) nghiền nát toàn bộ listView navigation tab. Nói cách khác eveything là ok chỉ khi mỗi mục danh sách có ít nhất một tabstop bên trong và trong trường hợp đó - có - bạn chỉ cần thiết lập không có tabstop cho mục container để làm cho nó được thực hiện tốt. nhưng nếu một số mặt hàng hoạt động như tiêu đề thì sao? Hãy giúp tôi. – mjollneer

Các vấn đề liên quan