2011-09-22 5 views
0

항목이 텍스트 상자 인 목록 상자가 있습니다. 포커스를 다음 텍스트 상자로 변경하고 내용 편집을 시작하려면 키를 설정해야합니다. 내가 예를 들어, 내가 원하는 것을 달성하기 위해 키 스트로크를 보내는 솔루션 비리가있다 :텍스트 상자의 포커스 목록 변경 WPF

 ((TextBox)listBox1.Items[0]).KeyDown += (object x, KeyEventArgs y) => { 
      if (y.Key == Key.Enter) { 
       InputSimulator.SimulateKeyDown(VirtualKeyCode.TAB); 
       InputSimulator.SimulateKeyPress(VirtualKeyCode.DOWN); 
       InputSimulator.SimulateKeyDown(VirtualKeyCode.TAB); 
      } 
     }; 

내가 그 접근 여기 http://inputsimulator.codeplex.com/있는 라이브러리 InputSimulator을 사용합니다. 이것이 올바른 방법이 아니라는 것을 알고 있으므로 포커스 메서드를 사용하여 어떻게 동일한 결과를 얻을 수 있는지 묻습니다. 다음 코드로 시도하지만 이해가 안되는 "범위를 벗어난"오류가 발생합니다.

private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     for (int i = 0; i < 3; i++) 
     { 
      listBox1.Items.Add(new TextBox() { 
       TabIndex=i 
      }); 

     } 
     for (int i = 0; i < listBox1.Items.Count-1; i++) 
     { 
      ((TextBox)listBox1.Items[i]).KeyDown += (object x, KeyEventArgs y) => { if (y.Key == Key.Tab) { Keyboard.Focus((TextBox)listBox1.Items[i+1]); } }; 
     } 
     ((TextBox)listBox1.Items[listBox1.Items.Count - 1]).KeyDown += (object x, KeyEventArgs y) => { if (y.Key == Key.Tab) { Keyboard.Focus((TextBox)listBox1.Items[0]); }}; 

    } 
+0

예제 코드를 약간 정리하면 질문에 대한 더 많은 답변을 찾을 수 있습니다. 처음부터 너무 많이 성명을 발표하지 마십시오. –

답변

1

다음은 정말 간단한 답변입니다. XAML에서는

<Window x:Class="Interface.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 

    <Window.Resources> 
    <Style TargetType="{x:Type TextBox}"> 
     <EventSetter Event="KeyDown" Handler="TextBox_KeyDown"/> 
     <Setter Property="Width" Value="100"/> 
    </Style> 
    </Window.Resources> 


    <ListBox Name="lstBoxList"> 
    <TextBox>ABC</TextBox> 
    <TextBox>DEF</TextBox> 
    <TextBox>GHI</TextBox> 
    </ListBox> 

</Window> 

그래서 당신이 목록에서 텍스트 상자를 모두 볼 수 있습니다 ... 당신의리스트 박스를위한 공통의 핸들러를 정의하는 스타일을 사용할 수 있습니다. 실제 처리기 코드는 다음과 같습니다.

private void TextBox_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.Enter) 
    { 
    // Locate current item. 
    int current = lstBoxList.Items.IndexOf(sender); 

    // Find the next item, or give up if we are at the end. 
    int next = current + 1; 
    if (next > lstBoxList.Items.Count - 1) { return; } 

    // Focus the item. 
    (lstBoxList.Items[next] as TextBox).Focus(); 
    } 
} 

그래서 기본 개념은 현재 텍스트 상자를 목록에 배치하는 것입니다. 그런 다음 어떻게 든 다음 태그와 이름 등을 찾아서 명시 적으로 집중시킵니다. 물론 정확한 필요에 따라 조정해야합니다.

+0

아마 내가 아직 솔루션을 잘못 이해하지 않았기 때문에, 당신의 작업이 잘되어서 사용하지 않을 것입니다. 감사합니다. – mjsr

+0

이와 관련하여 Windows로드시 첫 항목에 포커스를 설정하는 방법을 모르겠습니다. (ListBox1.Items [0] as TextBox) .Focus() 버전을 즉시 시작하지 마십시오. Tab 키를 한 번 더 눌러야합니다. 어떻게 할 수 있니? 모든 TextBox는 동적으로 만들어집니다. – mjsr

+0

@voodoomsr : 나는 당신의 예가 잘못되었다고 생각하지 않는다. 정확히 안정되지 않은 방식으로하고있다. 윈도우가로드 될 때 텍스트 상자를 집중 시키려면 Window.Loaded 이벤트 또는 이와 비슷한 방법으로 시도하십시오. 죄송 합니다만, 여기에 더 자세한 내용을 말씀 드릴 수는 없습니다. –

관련 문제