2016-01-16 3 views
0

Это было задано несколько раз, но я не мог использовать ни один из ответов. Моя проблема в том, что каждый раз, когда я хочу изменить значение трекбаров, он сфокусирован, даже когда я нажимаю на другие части окна. И когда я хочу использовать ключи, они просто работают в трекболке.Трекбар продолжает красть мой фокус

Что Стараюсь ?:

-I попытался установить CausesValidation/TabStop/Topmost к false/true

-I пытался использовать MouseLeave/FocusEnter события, чтобы установить фокус назад на моей форме с this.Focus()

-I пытался поставить

protected override bool IsInputKey(Keys keyData) 
{ 
    return true; 
} 

и/или

protected override bool ShowWithoutActivation 
{ 
    get { return true; } 
} 

в Maincode

Здесь представлена ​​скриншот программы, чтобы понять мою проблему: It's german but that doesn't matter. I want to press Enter while I'm drawing the line but the trackbar keeps focused and blocks it

+1

Установить фокус на что-то еще? Вы не можете сфокусировать форму - нечего фокусировать.Вы можете сосредоточить экранный TextBox как последнее средство. – SimpleVar

+0

Но я должен реагировать на мое событие Key Keypress – bravobyte

+0

Использовать событие «мыши-вниз/клик» на клиенте. Из области (где у вас также есть это событие нажатия клавиши), в этом обработчике события удаляется фокус или устанавливается на сосредоточиться на другом контроле. – Stefan

ответ

0

Обычный способом является переопределить OnKeyDown события после установки KeyPreview = true :

protected override void OnKeyDown(KeyEventArgs e) 
    { 
     base.OnKeyDown(e); 
     // your code here.. 
     Text = "Testing: KeyCode" + e.KeyCode; 
    } 

Но вы также может использовать событие PreviewKeyDown. Обязательно установите для свойства формы KeyPreview значение true, а также добавьте общее событие для всех элементов управления, которые могут украсть/получить фокус!

Поскольку PreviewKeyDown события контролей usees другого аргумента, что вам нужно маршрутизировать событие KeyDown событий формы:

private void CommonPreviewKeyDown(object sender, PreviewKeyDownEventArgs e) 
    { 
     Form1_KeyDown(this, new KeyEventArgs(e.KeyCode)); 
    } 



    private void Form1_KeyDown(object sender, KeyEventArgs e) 
    { 
     // your code here.. 
     Text = "Testing: KeyCode" + e.KeyCode; 
    } 

Вы можете захотеть подключить ручки в коде:

void routeKeys(Control container) 
    { 
     foreach (Control ctl in container.Controls) 
      if (ctl.CanFocus) ctl.PreviewKeyDown += CommonPreviewKeyDown; 

    } 

Называйте это как это:

public Form1() 
    { 
     InitializeComponent(); 
     routeKeys(this); 
    } 

конечно Вы можете добавить фильтры для предотвращения маршрутизации ключей, ваша форма не собирается обрабатывать ..

разницу между этими двумя методами является, когда вы переопределить Form.OnKeyDown вы получите keyevents из любого места; это будет включать, например, Текстовые поля, в которых и ваш персонаж, и ваши ключи редактирования направляются в форму.

Если вы не хотите, что вам нужно добавить фильтр к событию:

if (tb_notes.Focused) return; 
if (tb_moreNotes.Focused) return; 
if (rtb_edit.Focused) return; 

Второй способ позволяет вам определить, какие элементы управления должны быть включены или исключены в маршрутизации ..:

if (ctl.CanFocus && !(ctl is TextBox || ctl is RichTextBox))    
    ctl.PreviewKeyDown += CommonPreviewKeyDown; 
+0

Ну, это было легче, чем я думал .. Мне просто пришлось изменить KeyPreview .. Спасибо, yooou – bravobyte

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