2010-03-09 1 views
1

나는 this question을 따라 갔지만 정상적으로 작동합니다. 그러나 포커스는 송신 컨트롤에서 제외됩니다.WPF : 대상 컨트롤에서 포커스를 빼지 않고 다른 컨트롤로 키를 보낼 수 있습니까?

내가하려는 것은 자동 완성 텍스트 상자 (텍스트 상자 및 일치하는 항목 목록이 포함 된 팝업 컨트롤)처럼 작동하는 입력 상자를 만드는 것입니다. 위로, 아래로 키를 가져 와서 팝업 컨트롤로 보내고 다른 키를 가져 와서 텍스트 상자에 보관할 수 있어야합니다.

switch (e.Key) 
     { 
      case Key.Down: 
      { 
       if (!popup.IsOpen) 
       { 
        openPopup(); 
       } 
       else 
       { 
        PresentationSource source = PresentationSource.FromVisual(itemList); 
        if (source == null) return; 

        itemList.RaiseEvent(
         new KeyEventArgs(Keyboard.PrimaryDevice, source, 0, e.Key) 
          {RoutedEvent = Keyboard.KeyDownEvent}); 

       } 
       break; 
      } 
     } 

위 itemList는 RaiseEvent를 호출하자마자 pop'd되고 focus가 전송되는 컨트롤입니다.

답변

1

음가 onPreviewItemListKeyDown에서

<StackPanel> 
    <Controls:SearchTextBox x:Name="searchBox" SearchMode="Instant" 
           PreviewKeyDown="onSearchBoxPreviewKeyDown" 
           KeyDown="onKeyDown" 
           Search="onSearch" Margin="5" /> 
    <Popup Name="popup" > 
     <ListBox x:Name="itemList" 
       SelectionMode="Extended" 
       KeyDown="onItemListKeyDown" 
       PreviewKeyDown="onPreviewItemListKeyDown" 
       /> 
    </Popup> 
</StackPanel> 

을 수행하면 팝업 컨트롤에서 처리하지 않으려는 키 위해

private void onPreviewItemListKeyDown(object sender, KeyEventArgs e) 
    { 
     switch (e.Key) 
     { 
      case Key.Down: 
      case Key.Up: 
      case Key.Enter: 
      case Key.Escape: 
      case Key.Space: 
      { 
       // swallow 
       break; 
      } 
      default: 
      { 
       searchBox.Focus(); 
       return; 
      } 
     } 
    } 

을 다음 .. 오히려 쉬운 것, 간단하게 설정 포커스를 초기 컨트롤로 되돌립니다. 미리보기 키 이벤트에서이 작업을 수행하면 그 이후의 키는 내 검색 창 컨트롤로 전달됩니다.

이것은 '느낌'이 아니라 .. 그것은 나를 위해 일하고 있습니다.

관련 문제