2011-02-24 2 views
0

나는 control-A와 같은 명령에 대해 RoutedCommands를 가지고 있으며, 모두 잘 작동합니다. 그런 다음 4 개의 routed 명령을 추가하여 화살표 키를 사용하여 캔버스에서 개체를 왼쪽이나 오른쪽으로 움직였습니다. 때로는 작동하고 때로는 작동하지 않습니다. 처음에는 Canvas의 포커스 문제라고 생각했지만 동시에 컨트롤 A와 같은 다른 라우트 명령어는 작동하지만 화살키는 그렇지 않다는 것을 알았습니다. 여기에 무슨 일이 일어나고 있는지 전혀 알지 못합니다. 서로 다른 변수 이름을 가진 동일한 라우팅 된 명령입니다. 어떻게 100 %의 시간 동안 작동하고 하나는 50 %의 시간에만 작동합니까?WPF 라우팅 된 명령에서만 가끔 발생합니다.

작업 RoutedCommand :

_bindings.Add(new CommandBinding(DesignerCanvas.SelectAll, SelectAll_Executed)); 
SelectAll.InputGestures.Add(new KeyGesture(Key.A, ModifierKeys.Control)); 

private void SelectAll_Executed(object sender, ExecutedRoutedEventArgs e) 
{ 
    SelectionService.SelectAll(); 
} 

오작동 RoutedCommand :

오작동 RoutedCommand는 그냥 다른 창을 연 다음, 캔버스에 다시가됩니다 와서 특히 후, 때로는 발사되지
_bindings.Add(new CommandBinding(DesignerCanvas.MoveDown, MoveDown_Executed)); 
MoveDown.InputGestures.Add(new KeyGesture(Key.Down)); 

private void MoveDown_Executed(object sender, ExecutedRoutedEventArgs e) 
{ 
    e.Handled = true; 
    var selectedItems = from item in SelectionService.CurrentSelection.OfType<DesignerItem>() 
          select item; 

    if (selectedItems.Count() > 0) 
    { 
     for (int i = 0; i < selectedItems.Count(); i++) 
      selectedItems.ElementAt(i).Top += Option.OptionSingleton.Sensitivity; 
    } 
} 

다른 라우트 명령어가 영향을받지 않는 동안 발사를 중지합니다. 이 이상한 행동을 일으키는 아이디어가 있습니까? 이 바인딩 명령에 도달하기 전에에서 KeyDown이 처리되거나 CanExecute 이벤트가 도달하지 않을 수 있습니다 귀하의 경우

EventManager.RegisterClassHandler(typeof(FrameworkElement), CommandManager.CanExecuteEvent, 
    new CanExecuteRoutedEventHandler((s, e) => Debug.WriteLine("CanExecute: " + s)), true); 
EventManager.RegisterClassHandler(typeof(FrameworkElement), CommandManager.ExecutedEvent, 
    new CanExecuteRoutedEventHandler((s, e) => Debug.WriteLine("Executed:" + s)), true); 
EventManager.RegisterClassHandler(typeof(FrameworkElement), CommandManager.ExecutedEvent, 
    new CanExecuteRoutedEventHandler((s, e) => Debug.WriteLine("KeyDown:" + s)), true); 

:

는 는

답변

1

포커스 문제 였으므로 마우스를 입력 할 때마다 캔버스에 초점을 맞추기 만하면됩니다. 이제는 고정되어 있습니다. 응답 해 주신 모든 분께 감사드립니다.

2

당신은 sometiems 이벤트의 경로를 추적하는 매우 포괄적 인 수준의 이벤트 핸들러를 사용할 수 있습니다 다른 이유로.

는 희망이 당신이

1

이있을 수 있습니다 인해 사용중인 키는 "아래"키는 사실에 문제를 디버깅하는 데 도움이됩니다. 나는 다른 열쇠를 사용했다면 효과가있을 것이라고 생각합니다.

일부 컨트롤은 화살표 키와 페이지 업/페이징 키를 사용합니다. 예를 들어 TextBox에서는이 작업을 수행합니다. 캔버스가 스크롤 뷰어에 있으면 스크롤 뷰어가 그것을 먹었을 수 있습니다.

  1. 키 제스처를 먹고 컨트롤에 바인딩을 추가

    이 두 가지 해결 방법이 있습니다.

  2. 핸들 키패드 (또는 키 스트로크를 먹는 컨트롤의 부모)에 대한 키 프리뷰와 거기에서 명령을 실행하십시오.

this question에 대한 대답은 각 명령에 대한 KeyPreview 처리기에서 특정 코드를 작성하지 않고 # 2를 할 수있는 방법을 보여줍니다.

관련 문제