2010-12-30 1 views
2

datepicker가 표준 키를 라우트 된 이벤트에서 부모 컨트롤의 키로 전달하지만 리턴 키가 아닌 이유를 알고있는 사람이 있는지 궁금합니다. 여기wpftoolkit datepicker가 리턴 키 작동 중단 이벤트를 왜 사용합니까?

<WrapPanel Name="_wpParameters" 
       Grid.Row="0" Grid.Column="0" 
       Orientation="Horizontal" 
       Grid.IsSharedSizeScope="True" 
       Keyboard.KeyDown="_wpParameters_KeyDown" > 
     <!-- this is where the dynamic parameter controls will be added --> 
    </WrapPanel> 

내가 리턴 키를 확인하기 위해 사용 된 코드입니다 :

여기에 내가 쓴 XAML이야

private void _wpParameters_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.Return) 
    { 
     RaiseEvent(new RoutedEventArgs(LoadLiveResultsEvent, this)); 
    } 
} 

내가 내려 사고에 키를 사용했다가 (키를 사용하여 의미 up)하지만 표준 숫자 및/문자가 논리는 발생하지만 리턴 키는 발생하지 않는다는 것이 흥미 롭습니다. 반환 키가 키 다운 키로 포함되지 않은 이유는 무엇입니까?

답변

3

KeyDown 이벤트는 특정 컨트롤에 예상대로 행동하지 않을 수 있습니다 낮은 수준 텍스트 입력 이벤트입니다. 이 은 일부 컨트롤에 합성 또는 클래스 처리가있어서 은 텍스트 입력 처리 및 관련 이벤트의 상위 버전을 제공하기 때문입니다. MSDN에 볼

은 ... 내 가정은 컨트롤이 이벤트를 소비 아마도 바인딩 소스와 다른 정리 텍스트를 투입하고 처리 된 다음 이벤트를 표시하는 점이다.

+0

매우 흥미 롭습니다 ... 나는 아마도 날짜 선택기의 가벼운 캘린더 컨트롤 부분이 텍스트 상자에 텍스트를 넣기 위해 selectedDate 값을 누르는 것을 처리하고 있다고 생각하고 있습니다. 그러나 잠재적 인 사용을 위해 이벤트를 거품처럼 보이게하고 싶지는 않습니까? –

+0

@ N8 주어진 기능을 제공하는 특정 컨트롤 일 필요는 없습니다. 확장 성을 제공/허용하도록 설계된 프레임 워크와 비교합니다. –

+0

아, 이벤트가 시작될 때와 마찬가지로 전체 복합 컨트롤 상태가 일시적입니다. (일명 바운드 값은 바인딩이 끝나거나 그와 비슷한 것일 수 있습니다.) 이벤트를 처리하고 컨트롤 (이 경우 datepicker)을 솔리드 상태로 만든 다음 다시 이벤트를 발생시키지 않겠습니까? 희망이있다. (내가 할 수 있다면 다시 투표 해 주겠다.) –

0

또한 내 솔루션에 대해 언급해야했습니다. 모든 하위보기 모델의 keyDown 이벤트를 처리하는 부모보기가 있습니다. 가 나는 등 DatePicker에서, MaskedTextBox에 ... 그 캐치 previewKeyDown 터널링 이벤트와 같은 특수 컨트롤에 대한 행동을 선언에서 KeyDown 버블 링을 올립니다 이벤트 :

public class EnterPressedBehavior : Behavior<UIElement> 
{ 
    public ICommand EnterPressedCommand { get; private set; } 

    protected override void OnAttached() 
    { 
     base.OnAttached(); 
     AssociatedObject.PreviewKeyDown += EnterPressed; 
    } 

    protected override void OnDetaching() 
    { 
     base.OnDetaching(); 
     AssociatedObject.PreviewKeyDown -= EnterPressed; 
    } 

    private void EnterPressed(object sender, KeyEventArgs keyEventArgs) 
    { 
     if (Keyboard.PrimaryDevice != null && Keyboard.PrimaryDevice.ActiveSource != null) 
     { 
      var eventArgs = new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, 0, keyEventArgs.Key) { RoutedEvent = UIElement.KeyDownEvent }; 

      AssociatedObject.RaiseEvent(eventArgs); 
     } 
    } 
} 

날짜 선택기에 할당이 동작 :

<DatePicker x:Name="BirthDateDatePicker" Grid.Column="1" 
        Grid.Row="6" Margin="3" HorizontalAlignment="Stretch"            
        IsEnabled="{Binding PersonFieldsEditDenied}" 
        Validation.ErrorTemplate="{StaticResource DefaultValidationTemplate}" 
        AutomationProperties.AutomationId="BirthDateDatePicker"> 
      <i:Interaction.Behaviors> 
       <viewModels:EnterPressedBehavior /> 
      </i:Interaction.Behaviors> 
</DatePicker> 

입니다 부모 뷰에서 듣고 :

<Window 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="" 
     KeyDown="OnKeyDownHandler"> 

코드 숨김

,
private void OnKeyDownHandler(object sender, KeyEventArgs e) 
    { 
     if (e.Key == Key.Enter) 
     { 
      // your code 
     } 
    }