2009-12-29 4 views
3

값이 편집 가능한 정말 간단한 이름/값 편집기 컨트롤을 작성하고 있습니다. 왼쪽에는 레이블이, 오른쪽에는 속성 텍스트 상자가 있습니다. 컨트롤은 잘 작동합니다. 사용자가 오른쪽의 "값"텍스트 상자 중 하나에 Tab 키를 누를 때 포커스가 내 컨트롤에서 다음 컨트롤로 바뀝니다. 컨트롤에서 다음 텍스트 상자로 포커스를 이동하여 사용자가 속성 텍스트 상자간에 탭을 이동할 수있게하고 싶습니다. 나는 "IsTabStop"을 true로 설정하려고했지만 작동하지 않는 것 같습니다.데이터 템플릿 내의 텍스트 상자에서 탭 정지가 작동하지 않습니다.

<DataTemplate x:Key="myDataTemplate"> 
     <StackPanel> 
      <TextBlock Text="{Binding Name}" /> 
      <TextBox IsTabStop="True" Text="{Binding Value, Mode=TwoWay}" /> 
     </StackPanel> 
    </DataTemplate> 

답변

4

것은 당신이 예를 들어, 항목 컨테이너 형 제어를위한 항목 템플릿으로 귀하의 DataTemplate을 사용하고 있습니까 :

여기 내 데이터 템플릿입니다 ListBox? KeyboardNavigation 클래스를 확인, 당신이 당신의 항목 컨테이너 또는 "주기" "계속"을 설정 자사의 TabNavigation 속성을 할 수 있습니다, 다음과 같이 매끄러운 :

<ListBox x:Name="myListBox" 
    KeyboardNavigation.TabNavigation="Continue" 
    ItemTemplate="{StaticResource myDataTemplate}" 
... 

초점이 목록 상자에서 탭 키를 사용하여 변경, 포커스는 각 요소에서 이동하고 마지막 요소에 도달하면 포커스는 "주기"의 첫 번째 요소로 돌아가거나 "계속"이 설정된 경우 폼의 다음 포커스 가능 컨트롤로 이동합니다. 이 도움이

희망, 안부

edit0 : 메이크업 텍스트 상자 목록 상자 항목이,

<ListBox x:Name="myListBox" 
    KeyboardNavigation.TabNavigation="Continue" 
    ItemTemplate="{StaticResource myDataTemplate}" 
    SelectionChanged="testList_SelectionChanged" 
... 
/> 
private void testList_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    Dispatcher.BeginInvoke(DispatcherPriority.Normal, new ThreadStart(() => 
    { 
     ListBoxItem item = testList.ItemContainerGenerator.ContainerFromIndex(testList.SelectedIndex) as ListBoxItem; 
     if (item != null) 
     { 
      TextBox textBox = GetDescendantTextBox(item) as TextBox; 
      if (textBox != null) textBox.Focus(); 
     } 
    })); 
} 

public static Visual GetDescendantTextBox(Visual element) 
{ 
    if (element == null) return null; 
    if (element is TextBox) return element; 
    Visual result = null; 
    if (element is FrameworkElement) 
     (element as FrameworkElement).ApplyTemplate(); 
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++) 
    { 
     Visual visual = VisualTreeHelper.GetChild(element, i) as Visual; 
     result = GetDescendantTextBox(visual); 
     if (result != null) break; 
    } 
    return result; 
} 
+0

이 도움이 덕분에 선정 된 직후에 포커스를받을! 하지만 지금은 텍스트 상자 주위에 탭이 보이고 itemcontainer처럼 보입니다. TextBox에 포커스, 모든 아이디어가 있어야만 했나요? – will

+0

listboxitem이 선택 될 때마다 편집 상자에 포커스를 전달하는 것이 좋습니다. 목록 상자의 SelectionChanged 이벤트 처리기로 원래 게시물을 편집했습니다. 그것이 당신을 위해 작동하는지 확인하십시오, 안부 –

+0

대접, 너무 많이 Serge 감사 ... – will

관련 문제