2015-08-11 3 views
1

Я пытаюсь открыть окно автоматического закрытия предупреждений, которое появляется под определенным элементом управления, который неправильно используется пользователем.Окно предупреждения/предупреждения не появится в месте управления

В настоящее время я использую механизм DevExpress AlertControl. Его расположение должно быть установлено с помощью BeforeFormShow события, поэтому я использую следующий класс менеджера, чтобы установить свое местоположение и показать предупреждение с конкретным сообщением:

class AlertPopper 
{ 
    private AlertControl _alert; 
    private Form _form; 
    private int _x, _y; 

    /// Pass in an AlertControl to be managed by the AlertPopper. 
    public AlertPopper(Form form, AlertControl alert) 
    { 
     _form = form; 
     _alert = alert; 
     _x = _y = 0; 

     _alert.BeforeFormShow += SetAlertLocation; 
    } 

    private void SetAlertLocation(object sender, AlertFormEventArgs e) 
    { 
     e.Location = new System.Drawing.Point(_x, _y); 
    } 

    public void DisplayAlert(int x, int y, string message) 
    { 
     _x = x; 
     _y = y; 

     var alertInfo = new AlertInfo("Warning", message); 
     _alert.Show(_form, alertInfo); 
    } 

    public void DisplayAlert(Control control, string message) 
    { 
     DisplayAlert(control.Location.X, control.Location.Y, message); 
    } 
} 

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

// In form constructor, start the alert manager: 
public MyForm() 
{ 
    _alertPopper = new AlertPopper(this, this.AlertWarning); 
} 


// ... then in some event handler method, display the alert: 
private void SomeControl_Click(Control sender, EventArgs e) 
{ 
    // ... in some catch block for a recoverable exception 
    _alertPopper.DisplayAlert(sender, "Bad thing happened."); 
} 

но вместо оповещения окно появляется под контролем, оказывается далеко (часто на неправильном отображении двух моих монитора установлен, но не здесь):

Alert shows up relative to screen corner, not window corner

Похоже, что координаты обрабатываются относительно моего экрана, а не моего окна. Как я могу получить предупреждение для отображения относительно последнего?

ответ

2

Вам необходимо использовать метод Control.PointToScreen.
Вот пример вашего метода DisplayAlert:

public void DisplayAlert(Control control, string message) 
{ 
    var point = new Point(control.Width/2, control.Height); 
    var screenPoint = control.PointToScreen(point); 

    DisplayAlert(screenPoint.X, screenPoint.Y, message); 
} 

Вот ваш случай метод обработчика:

private void SomeControl_Click(Control sender, EventArgs e) 
{  
    _alertPopper.DisplayAlert(sender, "Bad thing happened."); 
} 
+0

Ну что работал отлично. Спасибо за чистое решение! – kdbanman

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