2015-02-13 4 views
0

понимание домена
Я делаю приложение для стоматологов и в каком-то момент я должен показать зубы пациента и позволяет стоматолог регистрировать информацию о нескольких точках вокруг каждого зуб.
Чтобы сделать приложение динамическим, я создаю зубы в зависимости от пациента (у некоторых больше или меньше зубов).
Таким образом, рот имеет несколько зубов и в зависимости от настроек каждый зуб имеет несколько точек измерения.
Стоматологи регистрируют точки в разных заказах в зависимости от предпочтения (задаются в настройках). Некоторые регистрируют все точки на зубе, а затем переходят к следующему, другие регистрируют все точки вдоль передней части всех зубов, а затем все точки вдоль задней части зубов.Как переопределить естественные навигации в C# WinForms

Вопрос
Как я создаю каждый зуб и добавить точки измерения к нему, естественный порядок обхода: все точки на один зуб, перейти к следующему зубу [ПОВТОР].
Мне нужно управлять этим по-другому.

Мне нужно иметь возможность перемещаться (вкладка) в элемент управления в другом пользовательском контроллере, а затем возвращаться позже для остальных точек.

Обе вкладки и клавиши со стрелками вызывают навигацию, поэтому мне приходится иметь дело с обоими (ну все навигации, но это те, я обнаружил, далеко)

проб и ошибок
Я попытался для отмены OnKeyUp/Down/Press и обработки событий для нажатия клавиши, но безрезультатно.
Вместо этого я получаю двойной эффект; как моя навигация, так и естественная навигация.

Какой самый умный и простой способ быть в полном контроле над навигацией?

ответ

0

Для вкладки есть функция ContainerControl, называемая ProcessTabKey. Здесь естественная навигация для Tab происходит. Если изменить это вы можете предоставить собственную навигацию: (или просто возвращает истину и сделать это где-нибудь еще)

protected override bool ProcessTabKey(bool forward) 
{ 
    return forward ? this.NextPoint() : this.PreviousPoint(); 
} 

Что касается стрелки-навигации, я обнаружил, что будет немного сложнее. Существует ряд переопределяемых функций, которые регистрируют нажатия клавиш.
я думаю лучший один ProcessCmdKey. Эта функция должна возвращать «истину, если персонаж был обработан контролем, в противном случае лжи»:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
    { 
     if (keyData == Keys.Right) 
     { 
      this.NextField(); 
      return true; 
     } 
     if (keyData == Keys.Left) 
     { 
      this.PreviousField(); 
      return true; 
     } 
     if (keyData == Keys.Down) return true; 
     if (keyData == Keys.Up) return true; 
     return base.ProcessCmdKey(ref msg, keyData); 
    } 

Это приведет к моей навигации произойдет, и пусть рамки знают «я уже занимался этим» (или я может просто вернуть true и обрабатывать его где-то еще). Любые другие клавиши «команды» могут обрабатываться одинаково (например, Tab), однако это не обрабатывает модификаторы!

Как Tab, так и клавиши со стрелками перемещаются при нажатии Shift. Если я хочу, чтобы обрабатывать все мои навигации здесь он должен выглядеть примерно так:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
    { 
     switch (keyData) 
     { 
      case Keys.Right: 
      case Keys.Right|Keys.Shift: 
      case Keys.Enter: 
       // move to next field 
       this.NextField(); 
       return true; 
      case Keys.Left: 
      case Keys.Left|Keys.Shift: 
       // move to previous field 
       this.PreviousField(); 
       return true; 
      case Keys.Down: 
      case Keys.Down|Keys.Shift: 
      case Keys.Up: 
      case Keys.Up|Keys.Shift: 
       // disable native navigation 
       return true; 
      case Keys.Tab: 
       // move to next point 
       return this.NextPoint(); 
      case Keys.Tab|Keys.Shift: 
       // move to previous point 
       return this.PreviousPoint(); 
     } 
     return base.ProcessCmdKey(ref msg, keyData); 
    } 

Handling Вкладка в ProcessCmdKey исключает необходимость переопределения ProcessTabKey.

+0

_ [Этикет для ответа на ваш собственный вопрос] (http: //meta.stackexchange.ком/вопросы/17845/Этикет-для-ответа на Ваше собственное-вопрос) _ – MickyD

Смежные вопросы