2013-04-22 1 views
1

Не знаю, как это объяснить, но:ToolStripDropDown теряет мыши AutoClose

  • есть контроль MyPopup, сделанный из ToolStripDropDown;
  • Есть много элементов, основанных на элементах управления MyPopup (вызывают их всплывающие окна);
  • Нет проблем с открытием всплывающего окна отForm;
  • но есть is есть проблема, с которой открывается всплывающее окно из popup.

Проблема заключается в том, что после всплывающего окна ребенка закрытие родительского всплывающего окна остается на экране, даже когда его родитель Form получают фокус. Единственный способ закрыть это застрявшее родительское всплывающее окно - это сосредоточиться на нем (с помощью мыши) и нажать Esc.

Чтобы иметь всплывающее окно, способное показать другое всплывающее окно, я должен обмануть Closing событие:

void Popup_Closing(object sender, ToolStripDropDownClosingEventArgs e) 
    { 
     // prevent from closing when stay 
     if (_stay && e.CloseReason != ToolStripDropDownCloseReason.CloseCalled) 
     { 
      e.Cancel = true; 
      return; 
     } 
    } 

Перед из после закрытия детского всплывающего окна, родительское всплывающее окно имеет:

  • значение _stay является False;
  • значение Popup.AutoClose - True;

Я попытался «принести» мышь фокус назад к родительскому всплывающее окно со следующим:

  • TopLevel=true не везение;
  • Focus(); не повезло;
  • Focused=true; не повезло;
  • AutoClose=true; не повезло;
  • Captured=true; не повезло;

Также попытался установить значение выше значения False, а затем до True, по-прежнему не повезло.

А вот еще какой-то код, который может быть полезен или нет:

public class MyPopup : UserControl 
{ 
    protected bool _stay = false; 

    private ToolStripDropDown _popup; 
    private ToolStripControlHost _host; 

    public MyPopup() 
    { 
     // create popup 
     _popup = new ToolStripDropDown(); 
     _popup.Margin = _popup.Padding = Padding.Empty; 
     _popup.AutoSize = false; 
     _popup.Closing += Popup_Closing; 
     // add host 
     _host = new ToolStripControlHost(this); 
     _host.Margin = _host.Padding = Padding.Empty; 
     _host.AutoSize = false; 
     _popup.Items.Add(_host); 
    } 

    public void Show(Control parent, int x, int y) 
    { 
     _popup.Show(parent, x, y); 
    } 

    public new void Hide() 
    { 
     _popup.Close(); 
    } 

    private void Popup_Closing(object sender, ToolStripDropDownClosingEventArgs e) 
    { 
     // prevent from closing when stay 
     if (_stay && e.CloseReason != ToolStripDropDownCloseReason.CloseCalled) 
     { 
      e.Cancel = true; 
      return; 
     } 
    } 

    protected void PopupChildClosedDefaultEvent(object sender, EventArgs e) 
    { 
     // hide popup if mouse is outside of client region when closing child popup 
     if (!ClientRectangle.Contains(PointToClient(MousePosition))) 
      Hide(); 
     else 
     { 
      // >> here I am trying different things << 
      _popup.AutoClose = false; 
      _popup.AutoClose = true; 
     } 
    } 
} 

public class PopupParent: MyPopup 
{ 
    private void TestChildren() 
    { 
     _stay = true; 
     PopupChild popup = new PopupChild(); 
     popup.Show(button1, 0, 0); 
     popup.Closed += PopupChildClosedDefaultEvent; 
     _stay = false; 
    } 
} 

public class PopupChild: MyPopup 
{ 
} 

Вопрос: Есть ли способ, чтобы исправить «сломанной» всплывающее окно после того, как он потерял свою способность AUTOCLOSE на события мыши (щелчок где-то за пределами клиентской области)?

+0

Возможно, это связано с ошибкой, представленной в .NET 4.5, также затрагивающей.NET 4.0. Он снова исправлен, нажатый через Центр обновления Windows. Обязательно разрешите ему обновить вашу машину. –

+0

win7pro64, все обновления, все еще проблема .. будет придерживаться решения с повторным открытием. – Sinatr

ответ

0

Хорошо, утром принести некоторую свежесть мозги, и мне удалось решить эту проблему со следующим:

  _popup.Close(); 
      _popup.Show(_parent, _x, _y); 

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

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

  • Нет связанных вопросов^_^