2016-02-15 1 views
2

Я пытаюсь применить поведение фокуса, похожее на синюю границу кнопки на FlowLayoutPanel. Я пытался использовать GotFocus и LostFocus, но ясно, что это не путь.C# Применить сфокусированные свойства к FlowLayoutPanel как поведение кнопки

private void FlowLayoutPanel_Click(object sender, EventArgs e) 
{ 
    (sender as Control).BackColor = SystemColors.GradientActiveCaption; 
    //More operations. 
} 

private void Panel_LostFocus(object sender, System.EventArgs e) 
{ 
    (sender as Control).BackColor = default(Color); 
    //More operations. 
} 

Хотя нажав на ничего FlowLayoutPanel происходит и при использовании вкладки два события вызывается один за другим.

Любые предложения?

ответ

2

FlowLayoutPanel по умолчанию не является выбираемым элементом управления. Вы можете создать настраиваемую панель компоновки потока, исходя из FlowLayoutPanel и установить Selectable и UserMousecontrol styles, чтобы сделать ее доступной с помощью мыши. Кроме того, чтобы принять табулятора, установите TabStop свойство верно:

class ExFlowLayoutPanel:FlowLayoutPanel 
{ 
    public ExFlowLayoutPanel():base() 
    { 
     SetStyle(ControlStyles.Selectable, true); 
     SetStyle(ControlStyles.UserMouse, true); 
     TabStop = true; 
    } 
} 

Тогда вы можете справиться GotFocus и LostFocus или Enter и Leave события.

+0

Hi Reza Aghaei, Кажется, это позволяет мне установить событие Enter, но оставить все еще не файл .. Любые мысли? –

+1

Hi AmitLipman. Дайте мне знать, если у вас есть какие-либо вопросы по поводу ответа. –

+1

Я тестировал Enter и Leave, GotFocus и LostFocus, и все они работали правильно. Вероятно, чтобы увеличить событие отпуска, вы нажимаете на область формы. Нажмите на другой выбираемый элемент управления, и события Leave и LostFocus будут повышаться. –

2

Единственный момент использования FLP заключается в том, чтобы организовать его дочерние элементы управления. Это всегда детский контроль, который фокусируется, а не FLP. Так что, ничего не происходит. Вам нужно будет подписаться на события Enter всех дочерних элементов управления, чтобы увидеть фокус, входящий в панель или один из его дочерних элементов. Уйти намного сложнее, так как это будет мерцать, как дешевый мотель.

Очень уродливое решение, вы не хотите этого. Вместо этого используйте событие Application.Idle, лучшая альтернатива при получении надежного события просто непрактична. Проверьте родителя этого.ActiveControl, как это:

public Form1() { 
     InitializeComponent(); 
     Application.Idle += CheckFlpFocus; 
     this.Disposed += delegate { Application.Idle -= CheckFlpFocus; }; 
    } 

    private bool FlpHasFocus; 

    private void CheckFlpFocus(object sender, EventArgs e) { 
     bool hasFocus = false; 
     for (var ctl = this.ActiveControl; ctl != null; ctl = ctl.Parent) { 
      if (ctl == flowLayoutPanel1) hasFocus = true; 
     } 
     if (hasFocus != FlpHasFocus) { 
      FlpHasFocus = hasFocus; 
      flowLayoutPanel1.BackColor = hasFocus ? Color.Black : Color.White; 
     } 
    }