Не знаю, как это объяснить, но: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 на события мыши (щелчок где-то за пределами клиентской области)?
Возможно, это связано с ошибкой, представленной в .NET 4.5, также затрагивающей.NET 4.0. Он снова исправлен, нажатый через Центр обновления Windows. Обязательно разрешите ему обновить вашу машину. –
win7pro64, все обновления, все еще проблема .. будет придерживаться решения с повторным открытием. – Sinatr