2016-11-28 13 views
1

У меня есть приложение WinForms, содержащее ToolStrip с ToolStripButtons. Некоторые действия кнопки отключают основную форму, когда действие кнопки происходит и снова включается, когда закончилось. Это делается для того, чтобы пользователь не нажимал на другие места во время действия, а также показывает WaitCursor, но это не относится к проблеме.ToolStripButton по-прежнему выделяется, когда форма отключена/включена

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

Я могу искусственно реплицировать проблему, показывая MessageBox, используя следующий код (фактическое действие не отображает окно сообщения, но открывает новую форму и заполняет сетку, но сетевой эффект тот же).

Вот фрагмент кода, чтобы повторить вопрос:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void toolStripButton1_Click(object sender, EventArgs e) 
    { 
     // Disable the form 
     Enabled = false; 

     // Some action where the user moved the mouse cursor to a different location 
     MessageBox.Show(this, "Message"); 

     // Re-enable the form 
     Enabled= true; 
    } 
} 
+0

ли Вы, попробуйте добавить 'this.Refresh();' как первую строку в 'toolStripButton1_Click'? – ispiro

+0

Я теперь попробовал ваш код, и синий фон исчезает, когда я закрываю MessageBox. – ispiro

+0

@ispiro Пробовал с 'this.Refresh();' но проблема все еще происходит. Возможно, вы закрыли MessageBox с помощью Enter вместо нажатия мышью? Не уверен, что это актуально, но я использую Visual Studio 2013 и .NET Framework 4.5. – Andres

ответ

2

я, наконец, нашел решение.

Я создал этот метод расширения, который использует отражение для вызова частного метода «ClearAllSelections» на родительском ToolStrip:

public static void ClearAllSelections(this ToolStrip toolStrip) 
    { 
     // Call private method using reflection 
     MethodInfo method = typeof(ToolStrip).GetMethod("ClearAllSelections", BindingFlags.NonPublic | BindingFlags.Instance); 
     method.Invoke(toolStrip, null); 
    } 

и назвать его после повторного включения формы:

private void toolStripButton1_Click(object sender, EventArgs e) 
{ 
    // Disable the form 
    Enabled = false; 

    // Some action where the user moved the mouse cursor to a different location 
    MessageBox.Show(this, "Message"); 

    // Re-enable the form 
    Enabled= true; 

    // Hack to clear the button highlight 
    toolStrip1.ClearAllSelections(); 
}